Tengo un Class<? extends Annotation>
e intenté llamar al newInstance()
pero Java me gritó por la razón obvia de que no puedo crear una instancia de una interfaz. Pero sé que frameworks como EasyMock son perfectamente capaces de instanciar interfaces. ¿Qué se necesita para obtener una instancia Annotation
completamente tonta de mi Class
?¿Es posible crear una instancia de una anotación de Java dada una clase <? extiende la anotación>?
¿Es posible crear una instancia de una anotación de Java dada una clase <? extiende la anotación>?
Respuesta
Las estructuras simuladas no crean interfaces de instancia, sino que crean clases que las implementan sobre la marcha en tiempo de ejecución. ¡Puede encontrar this javadoc enlightening para lo que quiere hacer!
No puede crear una instancia de una clase que no está completamente especificada.
Para ilustrar, llamando newInstance()
en una clase de tipo Class<Object>
sin duda lo cree un objeto, pero llamar newInstance()
en una clase de tipo Class<?>
dejaría el compilador preguntándose qué clase de todo el universo de posibilidades que se debe construir.
El hecho de que usted ha reducido el campo un poco especificando que en vez de ?
, que desea una ?
que se extiende Annotation
no quiere decir que en realidad ha nombrado una clase particular de construir. ? extends Annotation
solo significa "alguna clase que se extiende Annotation
" Sin nombrar la clase exacta, el Cargador de clases no puede determinar qué constructor llamar, porque no hay límite en el número de clases que pueden extenderse Annotation
.
EasyMock no crea instancias de interfaces. No estoy familiarizado con el marco, pero es probable que ejemplifique java.lang.Object (s) que extiendan la interfaz deseada, o ejemplifica algún tipo de clase de marco "detrás de escena" que se generó con una cláusula "implementa la interfaz" en la definición de clase. Las interfaces no tienen un constructor predeterminado.
Gracias a Affe por orientarme en la dirección correcta, comentaría su respuesta, pero no podría formatear la solución:
Annotation annotation = (Annotation) Proxy.newProxyInstance( clazz.getClassLoader(), new Class[] { Annotation.class }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) { return clazz; // only getClass() or annotationType() should be called. } });funciona como un encanto.
No puedo entender qué posible _good_ podría ser esta instancia de anotación rota. Es como si hubiera pedido una hamburguesa y obtuve una fotocopia de una vieja fotografía en blanco y negro de un sándwich de jamón. ¿Explique? –
Estoy trabajando con el código Guice que trata con anotaciones vinculantes. Excepto por '@ Named', solo' annotationType() 'y tal vez' getClass() 'se invocan en las' Anotaciones 'que paso al método que estoy llamando. Así que mientras mi 'Anotación' pueda imitar esos métodos, funcionará bien. – Steve
@Steve 'getClass()' no pasará al 'InvocationHandler' y devuelve' Proxy.class'. Pero probablemente quieras 'toString()' para el depurador. – Brainlag
Si conoce el tipo de anotación en tiempo de compilación, puede crear una clase que implemente la anotación como si fuera una anotación normal. Consulte también this answer.
- 1. Java cómo crear una instancia de una clase de cadena
- 2. método Java devolver una instancia de la clase <T se extiende somethng>
- 3. ¿Es posible hacer obligatorio el valor de una anotación Java?
- 4. ¿Es posible leer el valor de una anotación en java?
- 5. ¿Cómo puedo crear una nueva instancia de clase de una clase dentro de una clase (estática)?
- 6. Java - ¿`null` es una instancia de` object`?
- 7. ¿Es posible crear una instancia de clase anidada utilizando Java Reflection?
- 8. ¿Es posible cambiar la instancia de clase externa de una clase interna en Java?
- 9. Java: Clase de devolución (No es una instancia)
- 10. En PHP, ¿es posible crear una instancia de una clase sin llamar al constructor de la clase?
- 11. java force una clase que se extiende
- 12. ¿Es posible tener una instancia de clase de tipo "local"?
- 13. Cómo crear una anotación personalizada en java?
- 14. ¿Podemos crear una instancia de una interfaz en Java?
- 15. ¿Es una referencia nula una instancia de una clase?
- 16. @AspectJ pointcut para subclases de una clase con una anotación
- 17. Crear una instancia de una clase python en C#
- 18. C/C++ ¿Es posible obtener una "lista" de miembros de instancia al consultar una clase?
- 19. cómo crear dinámicamente una instancia de una clase en python?
- 20. crear una nueva instancia de una clase sin operador "nuevo"
- 21. Java una instancia de clase de la cadena
- 22. Métodos de anulación de Java al crear una nueva instancia de una clase
- 23. Java procesamiento 6 de anotación - conseguir una clase desde una anotación
- 24. Obtener instancia de Enum de la clase <? extiende Enum> usando el valor de cadena?
- 25. Clase 'Habitación' es abstracto; no se puede crear una instancia
- 26. Cómo crear una clase dinámicamente en Java
- 27. Cómo hacer AutoMapper crear una instancia de la clase
- 28. ¿Es posible crear una instancia de un objeto en Java sin llamar al constructor?
- 29. Java Enums: enumerar los valores enumerados de una clase <? extiende Enum>
- 30. ¿Es posible recorrer los miembros de una clase en java?
Creo que EasyMock usa CGLIB. Mockito usa CGLIB. CGLIB es una biblioteca que le permite crear un objeto proxy. Es más rápido que el proxy Java, ya que crea/manipula bytecode. – mjlee
EasyMock parece generar una clase con un nombre similar a $ Proxy0. El signo $ representa típicamente un nombre de clase interno/generado, y el 0 probablemente sea el número de clase imitado interno de acuerdo con la arquitectura interna de EasyMock. Así que el modo fácil aún crea una clase, no una interfaz; sin embargo, crea una clase que obviamente implementa la interfaz. –
Esta respuesta simplemente no tiene sentido. Hay tipos de comodines en la JVM pero nunca representan un tipo concreto. Cualquier puntero? Siempre se refiere a un tipo concreto. –