У меня есть следующий интерфейс Java
import org.springframework.stereotype.Repository;
@Repository
public interface ITest {
void testFunc();
}
И я использую интерфейс своего контроллера
@RestController()
@CrossOrigin(origins = "*")
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private ITest iTest;
@GetMapping()
public List test() {
return this.userService.getUsers();
}
@GetMapping("/test")
public String ttest() {
iTest.testFunc();
return "Hello World!";
}
}
Когда я вручную добавляю реализацию интерфейса, все работает нормально
Но я хочу добавить реализацию во время выполнения на основе конкретной конфигурации.
Это то, что я пытался сделать но не получилось, чего-то не хватает?
@SpringBootApplication
public class EcommerceApplication {
public static void main(String[] args) throws IOException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
String s = "package com.justtech.ecommerce.db;\n" +
"\n" +
"import org.springframework.stereotype.Component;\n" +
"\n" +
"@Component\n" +
"public class Test2 implements ITest {\n" +
"\n" +
"\n" +
" @Override\n" +
" public void testFunc() {\n" +
" System.err.println(\"Hello World\");\n" +
" }\n" +
"}\n";
dynamicClass(s, "com.justtech.ecommerce.db.Test2", "Test2");
SpringApplication.run(EcommerceApplication.class, args);
}
static void dynamicClass(String sourceCode, String className, String fileName) throws IOException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
System.err.println(System.getProperty("user.dir"));
File parent = new File(System.getProperty("user.dir"));
File sourceFile = new File(parent, fileName + ".java");
sourceFile.deleteOnExit();
FileWriter writer = new FileWriter(sourceFile);
writer.write(sourceCode);
writer.close();
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager standardJavaFileManager = javaCompiler.getStandardFileManager(null, null, null);
File parentDir = sourceFile.getParentFile();
standardJavaFileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(parentDir));
Iterable dynamicClass = urlClassLoader.loadClass(className);
// Method formula1 = dynamicClass.getDeclaredMethod("formula1");
// formula1.invoke(dynamicClass.newInstance());
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... dynmically
Java – динамическая реализация класса @Component ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1735996977
Anonymous
У меня есть следующий интерфейс Java
import org.springframework.stereotype.Repository;
@Repository
public interface ITest {
void testFunc();
}
И я использую интерфейс своего контроллера
@RestController()
@CrossOrigin(origins = "*")
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private ITest iTest;
@GetMapping()
public List test() {
return this.userService.getUsers();
}
@GetMapping("/test")
public String ttest() {
iTest.testFunc();
return "Hello World!";
}
}
Когда я вручную добавляю реализацию интерфейса, все работает нормально
Но я хочу добавить реализацию во время выполнения на основе конкретной конфигурации.
Это то, что я пытался сделать но не получилось, чего-то не хватает?
@SpringBootApplication
public class EcommerceApplication {
public static void main(String[] args) throws IOException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
String s = "package com.justtech.ecommerce.db;\n" +
"\n" +
"import org.springframework.stereotype.Component;\n" +
"\n" +
"@Component\n" +
"public class Test2 implements ITest {\n" +
"\n" +
"\n" +
" @Override\n" +
" public void testFunc() {\n" +
" System.err.println(\"Hello World\");\n" +
" }\n" +
"}\n";
dynamicClass(s, "com.justtech.ecommerce.db.Test2", "Test2");
SpringApplication.run(EcommerceApplication.class, args);
}
static void dynamicClass(String sourceCode, String className, String fileName) throws IOException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
System.err.println(System.getProperty("user.dir"));
File parent = new File(System.getProperty("user.dir"));
File sourceFile = new File(parent, fileName + ".java");
sourceFile.deleteOnExit();
FileWriter writer = new FileWriter(sourceFile);
writer.write(sourceCode);
writer.close();
JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager standardJavaFileManager = javaCompiler.getStandardFileManager(null, null, null);
File parentDir = sourceFile.getParentFile();
standardJavaFileManager.setLocation(StandardLocation.CLASS_OUTPUT, Arrays.asList(parentDir));
Iterable dynamicClass = urlClassLoader.loadClass(className);
// Method formula1 = dynamicClass.getDeclaredMethod("formula1");
// formula1.invoke(dynamicClass.newInstance());
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79328526/java-implement-component-class-dynmically[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия