有没有什么方法可以在运行时将新方法和属性注入类中?在运行期间将新方法和属性注入类
http://nurkiewicz.blogspot.com/2009/09/injecting-methods-at-runtime-to-java.html声明我们可以使用Groovy来做到这一点。
仅使用Java就可能吗?
有没有什么方法可以在运行时将新方法和属性注入类中?在运行期间将新方法和属性注入类
http://nurkiewicz.blogspot.com/2009/09/injecting-methods-at-runtime-to-java.html声明我们可以使用Groovy来做到这一点。
仅使用Java就可能吗?
仅使用 Java可以吗?
简单的答案是强调“你不想那么做!”。
这在技术上是可行的,但并非没有诉诸非常复杂,昂贵和脆弱的技巧,如字节码修改。即使如此,你也必须依靠动态加载来访问修改后的类型和(可能)反射以利用其新成员。总之,你会为自己创造很多痛苦,如果有什么收获的话,你会得到很多痛苦。
Java是静态类型语言,添加/修改类类型签名可以打破类的静态类型合同。
1 - AspectJ和等等让你注入额外行为变成一个类,但它可能不是“运行”注射液,你是后。当然,注入的方法将不能用于静态编译的代码调用。
是否有可能通过使用Java只是在做什么?
的确如此,“唯一”的东西,你所要做的就是定义一个instrumentation agent其提供适当的ClassFileTransformer
,你将不得不使用反射来调用添加的方法。然而,这不是你想要做的,但它是可行的,并且有一个明确定义的界面。如果你想修改现有的方法,你可能会对AspectJ感兴趣。
尽管可能,但它没有用。
你将如何访问这些新的领域和方法?
如果你想要的是添加的“属性”的可能性,你不能直接使用这些方法和字段(如“普通”字段和方法),因为他们不会被编译。
和“方法”中,可以使用Map<String, Object>
作为“动态属性”,使用Map<String, SuitableInterface>
作为“动态方法”,然后按名称查找它们。
如果您需要Java的扩展语言,可以添加嵌入式动态语言(如Javascript或Groovy);其中大部分可以访问任意的java对象和方法。
你可以用AOP做一些非常时髦的事情,虽然在运行时真正修改类是一个相当多毛的技术,需要大量的类加载魔法和魔术。
更容易的是使用AOP技术来生成目标类的子类,并向其中引入新方法,而不是称为“混入”或“引入”的AOP。请参阅here以了解Spring AOP如何实现它,但与您实际尝试实现的内容相比,这可能相当蹩脚。
Downvoter - 请解释。 – 2014-12-02 23:43:38