2013-10-07 58 views
5

因此对于这个项目,我试图在运行时扩展一个类。 我想知道的是,这甚至有可能吗?如果是这样,我该怎么做?这些东西有图书馆吗?在运行时扩展类

+0

你为什么要这么做?请澄清用例。我怀疑这是否可能。 –

回答

4

CGLib是你要找的图书馆。在扩展类或在运行时实现接口方面是相当强大的,所以许多流行的框架(如Spring或Hibernate)都使用它。

您可以创建类扩展的代码一样

public Object createProxy(Class targetClass) { 
    Enhancer enhancer = new Enhancer(); 
    enhancer.setSuperclass(targetClass); 
    enhancer.setCallback(NoOp.INSTANCE); 
    return enhancer.create(); 
    } 

虽然你可能会与期望的逻辑的有效方法拦截器更换NoOp回调。

+0

太棒了,谢谢! – PaulBGD

1

是的,可以在运行时扩展一个类。尝试一个能够在运行时修改字节码的库,例如javassistASM

0

答案取决于“扩展课程”的含义。在java中,“扩展”意味着声明另一个扩展第一个类的类(是一个子类)。所以如果你想创建一个给定类的子类,这是可能的 - 只需准备一个表示子类的字节数组并将其传递给类加载器即可。

如果要将字段或方法添加到现有类中,则只有在加载此类时才有可能,并且可以通过替换字节数组表示来完成。如果class已经加载,你不能以任何方式修改它。

+0

我只是想动态地选择扩展哪个类(因为类的类路径不断变化)。 – PaulBGD