Скомпилировать с javax.tools и работать без отражения
Я новичок в форуме и довольно новый о Java-кодировании.
В любом случае, я реализую свой Java-код для динамической компиляции и запуска различных классов, которые не известны априори и которые могут меняться со временем (не слишком часто). Я нашел очень полезный пример, предложенный здесь, основанный на javax.tools, но, поскольку моя работа должна выполняться в реальном времени позже, я бы хотел как можно больше избегать использования отражения Java. Знаете ли вы, существует ли способ запустить скомпилированный код без использования рефляции? Есть некоторая переменная, которую я могу получить после компиляции, которая указывает на класс, а затем использовать ее для создания экземпляра класса?
спасибо заранее Лука
1 ответ
Эй, смотри, я не знаю, если это правильно или это то, что вы хотите, но я бы разделить рамки как таковые...
Интерфейс интерфейса просто для облегчения понимания.
public interface fun {
void fun();
}
скажем так, кто-то создает код для вашего приложения или фреймворка... дайте ему свой интерфейс и скажите ему, чтобы он включил функциональность в этот метод... что-то вроде этого
public class TestDestination implements test.fun {
public void fun(){
System.out.println("Hello");
}
}
тогда все, что вам нужно сделать, это загрузить этот класс... вы можете получить имя из пользовательского ввода xml и т. д. и т. д.... это будет ваш исполнитель
public class TestLoad {
public static void main(String[] args) {
try {
Class t1 = Class.forName("test.temp.TestDestination");
fun temp = (fun) t1.newInstance();
temp.fun();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
я не уверен, что это именно то, что вы хотите... но было бы идеально держать загрузчик в отдельном потоке и загружать все классы, которые вы хотите в начале вашей программы, или лениво загружать его... надежда на ваш выбор это помогает, я предполагаю, что class.forName эффективен... поправьте меня, если не прав