Ho un Class<? extends Annotation>
e ho provato a chiamare newInstance()
ma Java mi ha urlato contro per l'ovvia ragione per cui non riesco a creare un'istanza di un'interfaccia. Ma so che framework come EasyMock sono perfettamente in grado di istanziare interfacce. Cosa sarebbe necessario per ottenere un'istanza Annotation
completamente stupida dal mio Class
?È possibile creare un'istanza di un'annotazione Java data una classe <? estende Annotazione>?
risposta
I framework Mock non istanziano le interfacce, costruiscono classi che li implementano al volo in fase di runtime. Potresti trovare this javadoc enlightening per quello che vuoi fare!
Non è possibile creare un'istanza di una classe che non è stata specificata completamente.
Per illustrare, chiamando newInstance()
su una classe di tipo Class<Object>
sarebbe sicuramente creare un oggetto, ma chiamando newInstance()
su una classe di tipo Class<?>
avrebbe lasciato il compilatore chiedendosi quale classe fuori di tutto l'universo di possibilità che dovrebbe costruire.
Solo perché si è ristretto il campo giù un po ', specificando che, invece di appena ?
, si desidera un ?
che si estende Annotation
non significa che hai effettivamente nominato una classe particolare di costruire. ? extends Annotation
significa semplicemente "una classe che estende Annotation
" Senza nominare la classe esatta, ClassLoader non riesce a capire quale costruttore chiamare, poiché non esiste un limite al numero di classi che potrebbero estendersi Annotation
.
EasyMock non crea un'istanza di interfacce. Non ho familiarità con il framework, ma probabilmente istanzia java.lang.Object (s) che estendono l'interfaccia desiderata, o crea un'istanza di una sorta di classe framework "dietro le quinte" che è stata generata con una clausola "implements interface" nella definizione della classe. Le interfacce non hanno un costruttore predefinito.
Grazie a Affe per avermi indirizzato nella giusta direzione - avrei commentato la sua risposta ma poi non sarei stato in grado di formattare la soluzione:
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. } });funziona come un incantesimo.
Non riesco a capire quale possibile _buona_ questa istanza di Annotazione rotta potrebbe farti. È come se avessi chiesto un hamburger e ottenuto una fotocopia di una vecchia fotografia in bianco e nero di un panino al prosciutto. Spiegare? –
Sto lavorando con il codice Guice che si occupa di annotazioni vincolanti. Tranne per '@ Named', solo' annotationType() 'e forse' getClass() 'vengono mai chiamati sul passaggio di' Annotation' al metodo che sto chiamando. Quindi, finché il mio 'Annotation' può imitare quei metodi, funzionerà bene. – Steve
@Steve 'getClass()' non viene passato a 'InvocationHandler' e restituisce' Proxy.class'. Ma probabilmente vuoi 'toString()' per il debugger. – Brainlag
Se si conosce il tipo di annotazione in fase di compilazione, è sufficiente creare una classe che implementa l'annotazione come se fosse un'annotazione normale. Vedi anche this answer.
- 1. Java Generics - Classe o Classe <? estende SomeClass>
- 2. È possibile implementare il metodo con la lista di firme <Classe <? estende Annotation >> in Java?
- 3. Classe Java che estende String (o simile)
- 4. Come determinare se una classe estende un'altra classe in Java?
- 5. È possibile creare un riferimento a un metodo di classe astratta in un metodo di classe che non lo estende?
- 6. Generics Java: Non è possibile creare una matrice di una classe annidata
- 7. Generici Java: <B estende BaseB> non corrisponde a <? estende BaseB>
- 8. Java Enum: elenca i valori enumerati da una classe <? estende Enum>
- 9. Java classe che estende contenente metodo main
- 10. Java Generics jolly estende classe finale
- 11. WildCard Java Generics: <? estende Numero> vs <T estende Numero>
- 12. Java - È possibile estendere tutte le sottoclassi di una classe con una singola classe?
- 13. Java Reflection: creare una classe di implementazione
- 14. È possibile creare un oggetto senza una classe in C#?
- 15. Generici e Classe <? si estende Enum <?>>, EnumSet.allOf (classe) vs class.getEnumConstants()
- 16. Elenco <? estende MyType>
- 17. Java: Dichiarazione di una mappa con due generici relativi tipi (?? <T> Mappa <Class <estende ClasseA <T>>, classe <estende ClassB <T> >>)
- 18. Come creare una classe dinamicamente in java
- 19. Non è possibile creare un array di LinkedList in Java ...?
- 20. Perché non è possibile assegnare I <? estende Tipo> a <Type>?
- 21. È possibile utilizzare Java per creare dll?
- 22. getDefaultTracker() da una classe che estende InputMethodService?
- 23. Come creare una rappresentazione JSON di una classe Java?
- 24. Perché non è possibile creare un'istanza di un'interfaccia o una classe astratta in java senza un metodo di classe anonimo?
- 25. Enum <? estende l'interfaccia>
- 26. Java come verificare se un valore stringa è un tipo di data Classe <?>
- 27. È possibile creare una shell C interattiva?
- 28. È possibile estendere una classe senza costruttori in Java?
- 29. Generici: non è possibile convertire da <cattura # 1-di? si estende Object, D> per <S,D>
- 30. È possibile eseguire FindBug contro una sola classe Java?
Credo che EasyMock usi CGLIB. Mockito usa CGLIB. CGLIB è una libreria che ti consente di creare un oggetto proxy. È più veloce del proxy Java poiché crea/manipola bytecode. – mjlee
Sembra che EasyMock generi una classe con un nome simile a $ Proxy0. Il simbolo $ rappresenta in genere un nome di classe interno/generato e lo 0 è probabilmente il numero di classe del mocked interno secondo l'architettura interna di EasyMock. La modalità così semplice crea ancora una classe, non un'interfaccia; tuttavia, crea una classe che implementa ovviamente l'interfaccia. –
Questa risposta è semplicemente una sciocchezza. Esistono tipi di caratteri jolly sulla JVM ma non rappresentano mai un tipo concreto. Qualsiasi? -pointer si riferisce sempre a un tipo concreto. –