Скомпилировать с 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 эффективен... поправьте меня, если не прав

Другие вопросы по тегам