Я думаю, что у вас есть несколько вариантов, ни один из них не хорош и все воняет в небесах архитектурной проблемы с тем, как вы решаете проблему, с которой вы столкнулись.
Делегирование Wrapper
Создайте класс DelegaingFoo , который выглядит следующим образом:
class DelegatingFoo {
Callable callMe;
public DelegatingFoo(Callable callMe) {
this.callMe = callMe;
}
public void fighters(){
calLMe.call();
}
};
Вместо этого установите это значение, передав объект Callable в конструктор, как вы выше.это отделяет код, который вы хотите запустить от бита, который его внедряет.
Используйте язык JVM
Компилируйте что-то, что может быть запущено через javax.скрипт , такой как BeanShell, Groovy и т. д. В зависимости от того, что вы в конечном итоге делаете, это может быть жизнеспособным вариантом.
Индивидуальный загрузчик классов
Еслиу вас есть возможность использовать альтернативный загрузчик классов (который представляет свои собственные проблемы), что чревато своими собственными проблемами, и создать что-то действительно довольно сложное.Если вы решите серьезно об этом подумать, то, глядя на что-то вроде платформы загрузки классов OSGi, вы можете получить некоторые подсказки (может даже подойти).
Манипуляция байт-кодом
Существует несколько библиотек, которые помогут с манипулированием / перехватом / генерацией / изменением байт-кода на лету:
ПРЕДУПРЕЖДЕНИЕ
Следует отметить, что все вышеперечисленное является хаком, с возрастающей развращенностью по мере его спуска.Я бы посоветовал пересмотреть мою архитектуру как можно скорее, так как я бы потратил деньги на то, чтобы сделать то, что вы делаете, более чётким и ясным.
Помните, что код, который вы пишете, должен быть легче для чтения - иначе вы создаетеголовная боль обслуживания для себя (или будущих владельцев проекта).