Busqué la sintaxis y busqué en la API, pero todavía estoy confundido sobre el proceso. También busqué Stackoverflow. ¿Cuál es la forma correcta de cargar una clase y crear un objeto de forma dinámica? En otras palabras, quiero que el usuario especifique qué tipo de objeto quiere crear y luego crea ese tipo de objeto. No quiero un menú, porque quiero que puedan elegir cualquier clase dentro del directorio actual.cargando dinámicamente una clase en Java
Respuesta
Suponiendo que la clase no tiene Arg-constructor, la forma más sencilla sería -
Object newObject = Class.forName(strFullyQualifiedClassName).newInstance();
Referencia - java.lang.Class
¿Qué pasa si tiene arg, y cómo llamo a un método en la clase? ¿Cómo echo newObject solo por el nombre de la clase? Cuando intento llamar a un método de la clase en el tipo Objeto, me dice que el método no está definido para el objeto. – rubixibuc
Si no conoce el tipo de clase en tiempo de compilación, deberá usar la función de reflexión para buscar y llamar a los métodos. Si el constructor tiene un argumento, usa 'getDeclaredConstructor()' en la clase devuelta desde 'Class.forName' como se muestra en la respuesta de Mike Samuel –
+1 a Justin. Además, en términos prácticos, no puede ser que no sepas absolutamente nada sobre la clase, ya que será muy difícil usarla. Tener estas clases desconocidas implementando una interfaz particular suele ser una buena estrategia. a continuación, puede hacer referencia a estos objetos por las interfaces para que pueda llamar a métodos, etc. –
ClassLoader.loadClass
cargará una clase. Obtiene un cargador de clases por myClass.getClassLoader()
y debe recurrir a ClassLoader.getSystemClassLoader()
si eso es nulo.
Una vez que tenga una instancia de clase, puede obtener sus constructores a través del getDeclaredConstructor(...)
. Así que si usted tiene un public class MyClass
con un constructor como public MyClass(String) { ... }
continuación
Class<MyClass> clazz = MyClass.class;
Constructor<MyClass> ctor = clazz.getDeclaredConstructor(String.class);
MyClass instance = ctor.newInstance("foo");
Lo anterior pasa por alto un montón de posibles excepciones.
es MyClass una instancia o una referencia estática a la clase? ¿Hay alguna manera de obtener el contructor de una clase pasando su nombre como una cadena a un método? ¿O de alguna manera similar a eso? – rubixibuc
'MyClass' es el nombre de la clase en este ejemplo. Una clase puede tener múltiples constructores (o ninguno para las interfaces); no hay "el constructor" para una clase. –
El 'MyClass.class' puede ser una sintaxis confusa. Es solo una forma de referirse a la instancia de clase para 'MyClass'. Entonces 'String.class.isInstance (x)' es otra forma de decir 'x instanceof String'. –
Aquí es lo que tengo trabajo. Este no es un producto finalizado, sino que es solo una prueba para ver si puedo hacer que funcione. Gracias a todos los que respondieron la pregunta :-).
public class SimLoader {
public static void main(String[] args)
{
try
{
Object simulator = Class.forName("SimX").newInstance();
((SimInterface)simulator).run();
}
catch(ClassNotFoundException e) {}
catch(InstantiationException e) {}
catch(IllegalAccessException e) {}
}
}
interface SimInterface {
void run();
}
class SimX implements SimInterface
{
public void run() {
System.out.println("Success");
}
}
La mejor solución para mí. Pero no se olvide de usar FullyQualifiedName para Class (como com.mycomapy.SimX, en su ejemplo quizás no sea necesario). –
- 1. Java dinámicamente Cargando una clase
- 2. Cómo crear una clase dinámicamente en Java
- 3. clase verbosa de Java cargando
- 4. Cargando scripts dinámicamente
- 5. Cargando dinámicamente un archivo DLL
- 6. Cargando dinámicamente CSS
- 7. En Clojure, ¿cómo usar una clase Java dinámicamente?
- 8. ¿Cómo cargar una clase Java dinámicamente en android/dalvik?
- 9. Creando una clase dinámicamente
- 10. Cargando dinámicamente jQuery y extensiones
- 11. Cargando dinámicamente Google Maps api
- 12. Cargando clases dinámicamente desde el jar
- 13. Cargando SVG en SVGWeb dinámicamente con JQuery
- 14. silverlight 4, cargando dinámicamente módulos xap
- 15. Cargando una biblioteca dinámicamente en Linux o OSX?
- 16. Cargando una clase desde una cadena
- 17. Instanciar dinámicamente una clase de Ruby similar a Java
- 18. Clase dinámica de PHP cargando
- 19. ¿Cómo recuperar dinámicamente una constante en Java?
- 20. Cargando módulos Node.js dinámicamente según la ruta
- 21. ¿Cómo crear dinámicamente una clase en C#?
- 22. Actionscript 3: ¿Cargando archivos ai dinámicamente?
- 23. ¿Cómo cargar dinámicamente la clase en Objective-C?
- 24. OneJar y clase dinámica cargando
- 25. Dinámico cargando una clase en Java con un nombre de paquete diferente
- 26. Java swing Cargando Animación
- 27. yii clase no está cargando
- 28. añadir dinámicamente anotación a una clase existente
- 29. Convertir dinámicamente el objeto java de la clase Object en una clase determinada cuando se conoce el nombre de clase
- 30. cómo crear dinámicamente una instancia de una clase en python?
¿Está tratando de cargar una clase del archivo binary.class o por nombre de clase? –
@JustinWaugh Hola Justin, ¿la respuesta aceptada es adecuada para cargar un archivo .class? – leaf