我正在编写我的硕士论文,其中涉及.NET中的AOP等等,我提到缺乏对在加载时替换类的支持,这是目前没有.NET的重要因素。执行真正动态编织的AOP框架 - 强制要求编织类必须扩展ContextBoundObject
或MarshalByRefObject
或在接口上公开其所有语义。
但是,由于ClassFileTransformer
:
ClassFileTransformer
。所有这一切都很顺利,但是我的项目总监在最后一刻告诉我,他给了他一个框架(和相关语言)列表,它们不支持更换课程。我现在真的没有时间去寻找这个:我只是做一个肤浅的研究并且可能在我的论文中提出错误的信息,我感到不舒服。
所以我问你,哦全能的编程社区,你能帮忙吗?当然,我不是要求你自己研究这个。简单地说,如果您确定确定特定框架支持/不支持此功能,请将其留作答案。如果你不确定,请不要忘记指出它。
非常感谢!
编辑:@ewernli
ClassFileTransformer
在Java中一样。您的回答非常有用。谢谢:))
答案 0 :(得分:4)
你是在询问(1)在运行时真正的类替换,还是(2)在加载类时转换类的工具,或者(3)支持动态类加载的语言?
Java支持使用ClassLoader
加载动态类,使用ClassFileTransformer
进行转换,但没有真正的类替换。
我不确定C#,但我认为你可以在运行时发出代码并动态创建新类,所以你可以实现(3)和可能(2)。
真正的班级替换主要仅由动态语言支持,例如Smalltalk,Ruby,我猜Python和其他几个。这需要转换类的实例以匹配新形状。如果类发生变化,它们通常会将新字段初始化为nil。
AFAIK,移植到JVM的动态语言对ClassLoader进行大量黑客攻击,以支持在运行时更换类。对于JRuby,请参阅A first taste of invoke dynamic以获取更多指示,了解他们现在是如何做到的,有什么问题,以及即将到来的invokedynamic
可能有何帮助。
由于类型系统的复杂性,静态类型语言不提供此功能。如果类中的方法签名发生更改,则已加载的其他现有类可能不必遵守不安全的新方法签名。但是,在java中,只要使用Java Platform Debugger Architecture签名相同,就可以更改方法。
尝试将此功能添加到Java和/或静态类型语言中:
本文概述了相关问题
不确定你最初的那个地址是否有问题,但这些指针可能对你的论文感兴趣。
答案 1 :(得分:2)
Java 语言不支持更换类文件。 JVM通过您提到的类公开该功能。因此,所有languages which have been ported to the JVM都可以利用它。
答案 2 :(得分:1)
答案 3 :(得分:1)
Objective-C的运行时库支持类的动态构造和注册,惰性方法注册和“方法调配”,通过它们可以在运行时切换方法实现。以前的版本支持“类调配”,通过它可以在运行时替换另一个类,但现在使用方法调配。 Here's the reference doc.