2013-05-29 10 views
10

Così sto usando la Java Riflessioni API per cercare un altro vaso per le classi che estendono Foo utilizzando il seguente codice:Riflessioni non potevano ottenere tipo di classe

Reflections reflections = new Reflections("com.example"); 
for(Class<? extends Foo> e : reflections.getSubTypesOf(Foo.class)) { 
    doSomething() 
} 

Quando faccio questo Riflessioni tiri il seguente errore:

org.reflections.ReflectionsException: could not get type for name com.example.ExtendsFoo 

Qualcuno sa come risolvere questo perché sono perplesso?

Grazie in anticipo!

+0

è necessario fornire un altro codice (come la classe ExtendsFoo), forse alcune informazioni sulla struttura del pacchetto e forse un po 'più della traccia dello stack dell'eccezione. –

+0

Reflections è una classe dell'API Java? Dacci più informazioni .. – Satya

+0

Sto usando questo come indicato dal mio tag: https://code.google.com/p/reflections/ – Kezz101

risposta

12

Il problema può essere causa di non avere un caricatore di classe in grado di risolvere il nome (anche se è in grado di risolvere il sottotipo). Questo sembra contraddittorio, ma ho avuto il messaggio di errore quando stavo costruendo una configurazione e usando ClasspathHelper.forClassLoader su un URLClassloader istanziato dall'applicazione per capire cosa scansionare sul classpath, ma non passare in URLClassLoader nella configurazione di Reflections in modo che potesse creare un'istanza cose correttamente.

quindi si consiglia di provare qualcosa sulla falsariga di quanto segue:

URLClassLoader urlcl = new URLClassLoader(urls); 
Reflections reflections = new Reflections(
    new ConfigurationBuilder().setUrls(
    ClasspathHelper.forClassLoader(urlcl) 
).addClassLoader(urlcl) 
); 

dove urls è un array di URL da vasi contenenti le classi che si desidera caricare. Stavo ricevendo lo stesso errore come te se non avessi la chiamata finale addClassLoader(...) allo ConfigurationBuilder.

Se ciò non funziona o non è applicabile, potrebbe essere utile impostare un punto di interruzione in ReflectionsUtil.forName(String typeName, ClassLoader... classLoaders)) per vedere cosa sta succedendo.

+0

Sì, questo era il problema che stavo avendo. Alla fine ho appena scritto la mia implementazione di 'getSubtypesOf'.Questo è anche meglio perché l'API di Reflections può essere troppo macchinosa per alcuni progetti. Se qualcuno vuole la classe fammelo sapere. – Kezz101

-3

La scansione per le classi non è semplice con Java puro.

Il framework Spring offre una classe denominata ClassPathScanningCandidateComponentProvider che può fare ciò di cui si ha bisogno. L'esempio seguente avrebbe trovato tutte le sottoclassi di MyClass nel pacchetto org.example.package

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true); 
provider.addIncludeFilter(new AssignableTypeFilter(MyClass.class)); 

// scan in org.example.package 
Set<BeanDefinition> components = provider.findCandidateComponents("org/example/package"); 
for (BeanDefinition component : components) 
{ 

Questo metodo ha l'ulteriore vantaggio di utilizzare un analizzatore di bytecode per trovare i candidati che significa che non verrà caricato tutte le classi che scansioni. Class cls = Class.forName (component.getBeanClassName()); cls // classe utilizzo trovati }

Fore maggiori informazioni leggere il link

+0

L'OP sta già utilizzando [Google Reflections] (https://code.google .com/p/reflections /), come indicato dal tag. –

3

Date un'occhiata: https://code.google.com/p/reflections/issues/detail?id=163

eccezione Reflections (nella sua attuale versione 0.9.9-RC1) non ri-lancio correttamente. Ecco perché potresti perdere la vera causa del problema. Nel mio caso si trattava di un file rotto .class, che il mio caricatore di classi predefinito non è riuscito a caricare e ha generato un'eccezione. Quindi, prima di tutto, cerca di assicurarti che la tua classe sia veramente caricabile.

+0

Questo era il mio problema. Ho due versioni di JDK installate (7 e 8). Stavo compilando un progetto Java8 con JDK8 ma eseguendolo con Java7. Ops! – Joel