2013-05-29 10 views
10

więc używam Java Reflections API szukać innego słoika dla klas, które rozciągają Foo stosując następujący kod:Odbicia nie mógł dostać typ klasy

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

Kiedy robię to Refleksje rzuca się następujący błąd:

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

Czy ktoś wie, jak rozwiązać ten problem, jestem zdumiony?

Z góry dziękuję!

+0

Musisz podać trochę więcej kodu (np. Klasa ExtendsFoo), być może trochę informacji o strukturze pakietu i może trochę więcej śladu stosu wyjątku. –

+0

Czy Reflections to klasa z Java API? podaj nam więcej informacji .. – Satya

+0

Używam tego, jak wskazuje mój tag: https://code.google.com/p/reflections/ – Kezz101

Odpowiedz

12

Problem może być spowodowany nie ma programu ładującego klasy, które można rozpoznać nazwy (choć można go rozwiązać podtyp). Brzmi to sprzecznie, ale miałem komunikat o błędzie podczas budowania konfiguracji i korzystania z ClasspathHelper.forClassLoader w instancji URLClassloader z zainstalowaną aplikacją, aby dowiedzieć się, co skanować w ścieżce klas, ale nie przekazywać wspomnianego URLClassLoader do konfiguracji Reflections, aby mógł on utworzyć instancję rzeczy poprawnie.

Więc może chcesz spróbować czegoś wzdłuż linii, co następuje:

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

gdzie urls jest tablicą adresów URL do słoików zawierających klas, które chcesz załadować. Otrzymałem ten sam błąd, gdy nie miałem ostatecznego połączenia addClassLoader(...) z ConfigurationBuilder.

Jeśli to nie działa lub nie ma zastosowania, może warto po prostu ustawić punkt przerwania w ReflectionsUtil.forName(String typeName, ClassLoader... classLoaders)), aby sprawdzić, co się dzieje.

+0

Tak, to był problem, który miałem. W końcu napisałem własną implementację 'getSubtypesOf'.Jest to również lepsze, ponieważ interfejs Reflections API może być zbyt kłopotliwy w przypadku niektórych projektów. Jeśli ktoś chce tej klasy, daj mi znać. – Kezz101

-3

Skanowanie na zajęcia nie jest łatwe z czystą Javą.

Wiosenne ramy oferuje klasę o nazwie ClassPathScanningCandidateComponentProvider, która może zrobić to, czego potrzebujesz. Poniższy przykład będzie znaleźć wszystkie podklasy MojaKlasa w pakiecie 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) 
{ 

Ta metoda ma tę dodatkową zaletę, stosując analizator kodu bajtowego, aby znaleźć kandydatów, co oznacza, że ​​nie będzie ładować wszystkie klasy skanuje. Class cls = Class.forName (component.getBeanClassName()); // użycie Klasa CLS znaleźć }

Fore więcej informacji przeczytaj link

+0

Program już korzysta z [Google Reflections] (https://code.google .com/p/reflections /), jak wskazuje tag. –

3

Spójrz: https://code.google.com/p/reflections/issues/detail?id=163

Reflections (w jego aktualnej wersji 0.9.9-RC1) nie re-throw wyjątek poprawnie. Dlatego możesz przegapić prawdziwą przyczynę problemu. W moim przypadku był to uszkodzony plik .class, który nie został załadowany przez mój domyślny program ładujący klasy i który rzucił wyjątek. Przede wszystkim upewnij się, że Twoja klasa jest naprawdę ładowalna.

+0

To był mój problem. Mam zainstalowane dwie wersje JDK (7 i 8). Kompilowałem projekt Java8 z JDK8, ale pracowałem z Java7. Whoops! – Joel

Powiązane problemy