2009-09-14 13 views

回答

9

仅使用 Java可以吗?

简单的答案是强调“你不想那么做!”。

这在技术上是可行的,但并非没有诉诸非常复杂,昂贵和脆弱的技巧,如字节码修改。即使如此,你也必须依靠动态加载来访问修改后的类型和(可能)反射以利用其新成员。总之,你会为自己创造很多痛苦,如果有什么收获的话,你会得到很多痛苦。

Java是静态类型语言,添加/修改类类型签名可以打破类的静态类型合同。


1 - AspectJ和等等让你注入额外行为变成一个类,但它可能不是“运行”注射液,你是后。当然,注入的方法将不能用于静态编译的代码调用。

+1

Downvoter - 请解释。 – 2014-12-02 23:43:38

1

所以,如果你真的疯了,你可以做些什么,如他们概述here。你可以做的是加载.java文件,找到正确的插入点,添加你需要的任何方法,调用java编译器并重载类。祝你好运调试混乱虽然:)

编辑This实际上可能是一些使用...

1

是否有可能通过使用Java只是在做什么?

的确如此,“唯一”的东西,你所要做的就是定义一个instrumentation agent其提供适当的ClassFileTransformer,你将不得不使用反射来调用添加的方法。然而,这不是你想要做的,但它是可行的,并且有一个明确定义的界面。如果你想修改现有的方法,你可能会对AspectJ感兴趣。

0

尽管可能,但它没有用。

你将如何访问这些新的领域和方法?

如果你想要的是添加的“属性”的可能性,你不能直接使用这些方法和字段(如“普通”字段和方法),因为他们不会被编译。

和“方法”中,可以使用Map<String, Object>作为“动态属性”,使用Map<String, SuitableInterface>作为“动态方法”,然后按名称查找它们。

如果您需要Java的扩展语言,可以添加嵌入式动态语言(如Javascript或Groovy);其中大部分可以访问任意的java对象和方法。

1

你可以用AOP做一些非常时髦的事情,虽然在运行时真正修改类是一个相当多毛的技术,需要大量的类加载魔法和魔术。

更容易的是使用AOP技术来生成目标类的子类,并向其中引入新方法,而不是称为“混入”或“引入”的AOP。请参阅here以了解Spring AOP如何实现它,但与您实际尝试实现的内容相比,这可能相当蹩脚。