我正在撰写我的硕士论文,其中涉及.NET中的AOP,我提到在加载时替换类的支持不足,这是一个重要因素,因为目前还没有执行真正动态编织的.NET AOP框架--而不是不强制要求编织类必须扩展ContextBoundObject或MarshalByRefObject,或者在接口上公开它们的所有语义。
但是,多亏了ClassFileTransformer,您可以在JVM中使用Java完成这一任务。
ClassFileTransformer。所有这些都很好,但是我的项目主管在最后一分钟要求我给他一个框架(和相关语言)的列表,这些框架(和相关语言)支持/不支持类替换。我现在真的没有时间去寻找这个问题:我只做一项肤浅的研究,在我的论文中加入错误的信息,我就不会感到舒服了。
所以我问你,哦,全能的编程社区,你能帮忙吗?当然,我不是要你们自己研究这个。简单地说,如果您确信某个特定的框架支持/不支持这一点,那么就让它作为一个答案。如果你不确定,请别忘了指出。
非常感谢!
编辑:@ewernli
ClassFileTransformer所做的那样。你的回答很有帮助。谢谢您:)
发布于 2010-06-15 08:49:29
您是在询问(1)在运行时真正的类替换,还是(2)在类加载时转换类的工具,还是(3)支持动态类加载的语言?
Java支持用ClassLoader加载动态类,用ClassFileTransformer进行转换,但不支持真正的类替换。
我不确定C#,但我认为您可以在运行时发出代码并动态创建新类,这样您就可以实现(3)甚至可能(2)。
真正的类替换主要是由动态语言支持的,例如Smalltalk、Ruby和其他一些。这需要转换类的实例以匹配新的形状。如果类发生变化,它们通常将新字段初始化为零。
移植到JVM的动态语言AFAIK对ClassLoader进行了广泛的黑客攻击,以支持运行时的类替换。对于JRuby,请参阅第一次体验调用动态以获得更多的指针--它们现在是如何实现的,有什么问题,以及即将到来的invokedynamic可能会有什么帮助。
这不是静态类型语言中提供的,因为类型系统很复杂。如果方法签名在类中更改,其他已加载的现有类可能不需要遵守不安全的新方法签名。但是,在java中,只要使用Java平台调试器架构签名相同,就可以更改方法。
有人试图将此特性添加到Java和/或静态类型化语言中:
本文对相关问题进行了概述。
不太清楚这是否解决了你最初的问题,但这些提示对你的论文来说可能是很有趣的。
发布于 2010-06-15 08:18:03
Java语言不支持类文件替换。JVM通过您提到的类公开该特性。因此,所有的已移植到JVM的语言都可以利用它。
发布于 2010-06-15 09:12:46
二郎支持热代码交换,如果您也在寻找建模动态类更新的理论框架,您可以查看Creol语言(解释)。
https://stackoverflow.com/questions/3043451
复制相似问题