Моя цель - динамически вводить новые атрибуты + методы установки геттера в определение класса во время выполнения. В настоящее время у меня есть метод для регенерации кода с добавленными атрибутами, которые затем скомпилируют сгенерированный код.
Первоначально у меня будет шаблон для каждого класса во время компиляции. После запуска проекта класс шаблона загружается во время выполнения. Я написал некоторый код для динамической генерации java-кода и его компиляции. Когда я загружаю только что созданный класс, используя приведенный ниже код, я не могу получить доступ к внедренным методам. Я думаю, что не могу перезаписать существующее определение среды выполнения. Я просмотрел много блогов, но все еще не мог понять, почему. Пожалуйста помоги.
Я получаю доступ к недавно добавленным методам в DROOLS, и на них нет ссылок ни в одном другом классе, который может вызвать проблемы во время компиляции. Правила обработчика правил с новыми атрибутами обновляются во время выполнения, поэтому мне необходимо соответствующим образом адаптировать свой код. Ниже приведен код ClassLoader. Этот код не генерирует никаких исключений, но не может решить мою задачу. Не уверен, что кодировка правильная.
public static boolean loadClass2RunTime() {
try {
File folder = new File("target");
File dir = new File(folder, "com/itap/template");
File[] classFiles = dir.listFiles();
URL[] url = new URL[] { folder.toURI().toURL() };
int i = 0;
for (File classFile : classFiles) {
if (classFile.getName().matches(".*\\.class")) {
System.out.println(classFile.getName().substring(0,
classFile.getName().lastIndexOf(".")));
ClassLoader loader = URLClassLoader
.newInstance(new URL[] { folder.toURI().toURL() });
Class cls = loader.loadClass("com.itap.template."
+ classFile.getName().substring(0,
classFile.getName().lastIndexOf(".")));
ClassLoader temp = cls.getClassLoader();
}
}
return true;
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}