Dynamiczne ładowanie klas w celu ich zbadania.

0

Witam wszystkich,
mam do rozwiązania następujący problem: chciałbym zbadać klasę/y za pomocą mechanizmu refleksji nie posiadając jednak tych klas załadowanych za pomocą classloader'a. Na przeszkodzie staje mi statyczna metoda forName(String) z klasy Class.

 public static Class<?> forName(String className)
                        throws ClassNotFoundException 

Okazuje się (tu proszę mnie sprostować, jeśli pisze coś nie tak, bo geniuszem w javie nie jestem), iż JVM wykorzystuje stringa jako nazwy do odnalezienia klasy załadowanej wcześniej przez classLoadera, albo ładuję ją po wywołaniu takiej funkcji. Refleksję o ile dobrze mi wiadomo można wykorzystać do tego celu o ile mówi się o wykorzystaniu jej do działającego pod nadzorem JVM skompilowanego programu. Problem w tym, iż chciałbym ją wykorzystać do zbadania zewnętrznego projektu, tzn wyjąć z plików źródłowych załadowanych za pomocą programu, określone informacje na temat metod, dziedziczenia, pól itd. Projekt załadowany zewnętrznie nie jest w żaden sposób kompilowany, a klasy nie są ładowane classloader'em.
Moje pytanie: czy mając program (pakiet) z pięcioma klasami mógłbym za pomocą jakiegoś mechanizmu kolejno załadować te klasy i skorzystać z mechanizmu refleksji???

Pozdrawiam
Michał

0

Masz pliki .java i chcesz na nich dokonać refleksji? No to musisz podpiąć jakiś kompilator Javy do projektu.

0

Nie trzeba, jeśli masz Javę >= 1.6. JRE umie wtedy kompilować.

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
File[] files = ;//tablica plików do skompilowania
try
{         
    StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);
    Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files));
    compiler.getTask(null,fileManager,null,null,null,compilationUnits).call();
    fileManager.close();
}
catch(Exception e)
{
    System.out.println(e);
}

Z moich doświadczeń wynika, że powyższy kod nie działa dla projektów uruchamianych w IDE, Pierwsza instrukcja zwraca null.

0

@bogdans:
Próbowałeś bez zainstalowanego JDK?

1

Byłem zbyt optymistycznie nastawiony.

0

Właśnie chodzi o to żeby nie podpinać żadnego kompilatora, ani robić tego bez zainstalowanego JDK. Mianowicie miało by to być coś w rodzaju rozwiązania zaproponowanego przez bogdana: tablica plików analizowanego projektu i po kolei branie każdego z nich w celu analizy.
Spróbuję coś zdziałać w tym temacie.
Pozdrawiam i dziękuje za podpowiedzi.
Jeśli, ktoś ma jakąś sugestię jeszcze to bardzo proszę o pomoc.

0

Możesz poczytać o BeanShell albo Groovy i zobaczyć czy nie załatwią sprawy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1