Как переопределить методы класса, созданного с помощью ClassLoader - PullRequest
3 голосов
/ 22 января 2012

Я хочу создать объект класса и переопределить некоторые его методы. например:

Foo bar = new Foo(){

    public void fighters(){
          //some stuff
    }

};

Проблема в том, что имя класса хранится в строке. Моим очевидным шагом было создание нового экземпляра с использованием метода Constructor.newInstance (Object o), например:

Class c = cl.loadClass("com.pom.Foo");
Foo f = (Foo) (c.getDeclaredConstructor(String.class).newInstance("Hello!"));

Хотя этот фрагмент кода успешно создает новый экземпляр класса, сейчас я не знаю, как переопределить его методы.

Есть предложения?

1 Ответ

2 голосов
/ 22 января 2012

Я думаю, что у вас есть несколько вариантов, ни один из них не хорош и все воняет в небесах архитектурной проблемы с тем, как вы решаете проблему, с которой вы столкнулись.

Делегирование Wrapper

Создайте класс DelegaingFoo , который выглядит следующим образом:

class DelegatingFoo {

    Callable callMe;

    public DelegatingFoo(Callable callMe) {
        this.callMe = callMe;
    }

    public void fighters(){
          calLMe.call();
    }

};

Вместо этого установите это значение, передав объект Callable в конструктор, как вы выше.это отделяет код, который вы хотите запустить от бита, который его внедряет.

Используйте язык JVM

Компилируйте что-то, что может быть запущено через javax.скрипт , такой как BeanShell, Groovy и т. д. В зависимости от того, что вы в конечном итоге делаете, это может быть жизнеспособным вариантом.

Индивидуальный загрузчик классов

Еслиу вас есть возможность использовать альтернативный загрузчик классов (который представляет свои собственные проблемы), что чревато своими собственными проблемами, и создать что-то действительно довольно сложное.Если вы решите серьезно об этом подумать, то, глядя на что-то вроде платформы загрузки классов OSGi, вы можете получить некоторые подсказки (может даже подойти).

Манипуляция байт-кодом

Существует несколько библиотек, которые помогут с манипулированием / перехватом / генерацией / изменением байт-кода на лету:

ПРЕДУПРЕЖДЕНИЕ

Следует отметить, что все вышеперечисленное является хаком, с возрастающей развращенностью по мере его спуска.Я бы посоветовал пересмотреть мою архитектуру как можно скорее, так как я бы потратил деньги на то, чтобы сделать то, что вы делаете, более чётким и ясным.

Помните, что код, который вы пишете, должен быть легче для чтения - иначе вы создаетеголовная боль обслуживания для себя (или будущих владельцев проекта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...