Witam!
Zastanawiam się, czy da się stworzyć program, który wywołuje metodę z podanego przez użytkownika pliku .class (zawierającego klasę dziedziczącą np. po interfejsie określonym w programie) i czy da się tworzyć obiekty takich klas?
Najprościej gdybyś do takiego pliku wsadził metodę main, I wtedy z lini komend odpalasz tylko
java plik
Można, tylko trzeba sobie taką klasę załadować w runtime przez jakieś Class.forName("")
i trzeba znać nazwę tej klasy, ale ta pewnie będzie pokrywać sie z plikiem .class
Musisz wtedy refleksja zrobić Class.forName("com.cośtam.MojaKlasa").newInstance()
, zrzutować to na jakiś sensowny typ (np. ten twój interfejs) i dalej juz normalnie operować.
Skomplikowane?
Class clas = null;;
Object object = null;
try
{
clas = Class.forName(NazwaKlasy);
object = clas.newInstance();
}
catch (Exception e)
{
System.out.println(e);
}
Ok, a w jaki sposób ustalić, z którego pliku .class ma korzystać program? Czy (jeśli mam ścieżkę do pliku) lokalizacja pliku .class może być dowolna?
Katalog zawierający klasę musi być wymieniony w zmiennej środowiskowej classpath
.
Możesz również stworzyć własny ClassLoader i skorzystać z metody defineClass:
https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#defineClass(java.lang.String,%20byte[],%20int,%20int)
W ten sposób potrzebne Ci są wyłącznie dane z tego pliku.
to może się przyda: http://stackoverflow.com/questions/10527658/instantiate-an-object-and-invoking-a-method-via-a-class-file-using-reflection-i
a plik .class można zdekompilować javap z opcją -v lub -c, żeby poznać pola i metody, które ta klasa posiada
jak robisz to pod Windą 10, to buffor wszystkiego nie złapie, ale można zapisać do pustego pliku. Najpierw stwórz pusty plik txt w katalogu w którym masz .class:
type NUL > nazwaloga.txt
potem wystarczy zapisać output javap w pliku:
javap -v NazwaKlasy.class > nazwaloga.txt
potem otwierasz plik i raczysz się zdekompilowanym kodem :D