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