es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo crear un constructor en java con parámetros de clase?

Quiero tener una clase para ejecutar otras clases en Java, como un constructor parametrizado con una clase para ejecutar esa clase más tarde, similar a esto:

class MyClass{
    Class classToRun;
    public MyClass(Class c) {
        super();
        this.classToRun = c;
    }
    public void runClass(){
        classToRun.someStaticMethod();
    }
}

donde las posibles clases de classToRun no tienen un ancestro común, pero todas tienen el método someStaticMethod y no tienen idea de la existencia de MyClass que las ejecuta.

Pero hay problemas, como que las clases internas no pueden tener métodos estáticos, las clases no se pueden convertir en Class, etc.

Existen soluciones para el uso de métodos de clase parametrizados, como:

https://stackoverflow.com/questions/4872978/how-do-i-pass-a-class-as-a-parameter-in-java

https://stackoverflow.com/questions/14846853/passing-a-class-as-an-argument-to-a-method-in-java

pero no para los constructores.

¿Cuál es la solución correcta para hacer esto?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una solución es utilizar la reflexión de Java para crear una instancia de la clase dinámicamente y luego llamar a su método estático.

    Aquí tienes una implementación basada en el código de ejemplo proporcionado:

    import java.lang.reflect.Method;
    
    class MyClass {
        Class<?> classToRun;
    
        public MyClass(Class<?> c) {
            this.classToRun = c;
        }
    
        public void runClass() throws Exception {
            // crear instancia de la clase para acceder al método estático
            Object classObj = classToRun.getDeclaredConstructor().newInstance();
            // obtener el método estático e invocarlo
            Method staticMethod = classToRun.getDeclaredMethod("someStaticMethod");
            staticMethod.invoke(classObj);
        }
    }
    

    En esta implementación, utilizamos Class.getDeclaredConstructor() para obtener un constructor para la clase dada y luego newInstance() para crear una nueva instancia de la clase.

    Luego utilizamos Class.getDeclaredMethod() para obtener una referencia al método estático que queremos llamar, y Method.invoke() para ejecutar ese método en la instancia que acabamos de crear.

    Esta aproximación debería funcionar para cualquier clase con un método estático llamado someStaticMethod, independientemente de si tiene un ancestro común con otras clases que podrían pasarse como classToRun.

Comments are closed.