2012-01-22 2 views
3

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

Foo bar = new Foo(){ 

    public void fighters(){ 
      //some stuff 
    } 

}; 

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

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

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

Любые предложения?

+2

Почему вы не можете просто создать класс, который переопределяет метод, компилирует его и создает экземпляр этого класса вместо Foo? –

+0

Java - это статически скомпилированный язык, вы не можете этого делать. Неправильный инструмент для работы. – skaffman

+0

@ skaffman: это не совсем правильно. Вы можете выполнить инъекцию кода времени выполнения (например, с помощью BCEL). (Не говорите, что вы должны это делать) – Mat

ответ

2

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

Делегирование 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/перехват/генерации/изменения на лету:

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

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

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

+0

Спасибо, все. @brainzzy спасибо за подробный ответ. Идея делегирующего класса очень хорошая. – divs1210

+0

Я по-прежнему рекомендую получить более широкий обзор полной архитектуры! В любом случае, удачи. –

Смежные вопросы