2013-05-29 16 views
10

So ich die Java Reflections API bin mit einem anderen Gefäß für die Klassen suchen, die Foo mit dem folgenden Code erweitern:Reflections konnte nicht Klassentyp erhalten

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

Wenn ich diese Reflections tun wirft den folgenden Fehler:

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

Kann jemand diesen Fehler beheben, bin ich ratlos?

Vielen Dank im Voraus!

+0

Sie müssen etwas mehr Code (wie die ExtendsFoo-Klasse), vielleicht ein paar Informationen über die Paketstruktur und vielleicht ein bisschen mehr der Stack-Trace der Ausnahme bereitstellen. –

+0

Ist Reflections eine Klasse von Java API? Geben Sie uns weitere Informationen .. – Satya

+0

Ich verwende dies wie von meinem Tag angezeigt: https://code.google.com/p/reflections/ – Kezz101

Antwort

12

Das Problem aufgrund nicht einen Klassenlader hat, kann sein lesen, die den Namen auflösen können (auch wenn es den Subtyp auflösen kann). Das klingt widersprüchlich, aber ich hatte die Fehlermeldung, als ich eine Konfiguration erstellte und ClasspathHelper.forClassLoader auf einem anwendungsinstanziierten URLClassloader verwendete, um herauszufinden, was auf dem Klassenpfad gescannt werden sollte, aber den URLClassLoader nicht in die Reflections-Konfiguration übergab, damit er instanziieren konnte Dinge richtig.

So können Sie etwas entlang der Linien der folgenden versuchen:

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

wo urls ist ein Array von URLS zu den Gläsern den Klassen, die Sie laden möchten. Ich habe den gleichen Fehler erhalten wie Sie, wenn ich nicht den letzten addClassLoader(...) Anruf an die ConfigurationBuilder hatte.

Wenn dies nicht funktioniert oder nicht anwendbar ist, kann es sinnvoll sein, einfach einen Haltepunkt in ReflectionsUtil.forName(String typeName, ClassLoader... classLoaders)) zu setzen, um zu sehen, was passiert.

+0

Ja, das war das Problem, das ich hatte. Am Ende habe ich meine eigene Implementierung von 'getSubtypesOf' geschrieben.Dies ist auch besser, weil die Reflections-API für einige Projekte zu umständlich sein kann. Wenn jemand die Klasse haben will, lass es mich wissen. – Kezz101

-3

Das Scannen nach Klassen ist mit reinem Java nicht einfach.

Das Spring-Framework bietet eine Klasse namens ClassPathScanningCandidateComponentProvider, die das tun kann, was Sie brauchen. Das folgende Beispiel würde alle Subklassen von MyClass in dem Paket finden 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) 
{ 

Dieses Verfahren den zusätzlichen Vorteil der Verwendung eines Bytecode-Analysator die Kandidaten zu finden hat, was bedeutet, es wird nicht alle Klassen laden scannt. Klasse cls = Class.forName (component.getBeanClassName()); // Verwendung Klasse cls gefunden }

Fore weitere Informationen das link

+0

Das OP verwendet bereits [Google Reflections] (https://code.google .com/p/reflections /), wie vom Tag angezeigt. –

3

Werfen Sie einen Blick: https://code.google.com/p/reflections/issues/detail?id=163

Reflections (in der aktuellen Version 0.9.9-RC1) Ausnahme nicht richtig wieder Wurf. Deshalb können Sie die wahre Ursache des Problems übersehen. In meinem Fall war es eine defekte .class Datei, die mein Standardklassenladeprogramm nicht laden konnte und eine Ausnahme ausgab. Also, zuallererst, versuchen Sie sicherzustellen, dass Ihre Klasse wirklich ladbar ist.

+0

Das war mein Problem. Ich habe zwei Versionen des JDK installiert (7 und 8). Ich habe ein Java8-Projekt mit JDK8 kompiliert, aber es mit Java7 ausgeführt. Hoppla! – Joel

Verwandte Themen