哪些框架(和相关语言)支持类替换?

时间:2010-06-15 08:06:10

标签: programming-languages frameworks aop classloader dynamic-class-loaders

我正在编写我的硕士论文,其中涉及.NET中的AOP等等,我提到缺乏对在加载时替换类的支持,这是目前没有.NET的重要因素。执行真正动态编织的AOP框架 - 强制要求编织类必须扩展ContextBoundObjectMarshalByRefObject或在接口上公开其所有语义。

但是,由于ClassFileTransformer

,您可以在JVM中使用Java执行此操作
  • 您延伸ClassFileTransformer
  • 您订阅了类加载事件。
  • 在类加载时,您重写该类并替换它。

所有这一切都很顺利,但是我的项目总监在最后一刻告诉我,他给了他一个框架(和相关语言)列表,它们不支持更换课程。我现在真的没有时间去寻找这个:我只是做一个肤浅的研究并且可能在我的论文中提出错误的信息,我感到不舒服。

所以我问你,哦全能的编程社区,你能帮忙吗?当然,我不是要求你自己研究这个。简单地说,如果您确定确定特定框架支持/不支持此功能,请将其留作答案。如果你不确定,请不要忘记指出它。

非常感谢!


编辑:@ewernli

  • 我在询问(2)。
  • 在C#中,您确实可以在运行时发出代码并动态创建新类,但它们是 new 类,它们不会替换现有类。我想做的是在加载时转换类,就像使用ClassFileTransformer在Java中一样。
  • 关于修改方法的签名:是的,你是对的。我应该提到,在我的情况下,我不想修改类的接口,而是修改其方法的内容。

您的回答非常有用。谢谢:))

4 个答案:

答案 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和/或静态类型语言中:

  • 对类型安全的动态Java类的运行时支持
  • 支持应用行为的意外动态适应
  • Java软件动态更新技术

本文概述了相关问题

  • 影响动态软件演化的类型系统

不确定你最初的那个地址是否有问题,但这些指针可能对你的论文感兴趣。

答案 1 :(得分:2)

Java 语言不支持更换类文件。 JVM通过您提到的类公开该功能。因此,所有languages which have been ported to the JVM都可以利用它。

答案 2 :(得分:1)

Erlang支持热代码交换,如果您还在寻找模拟动态类更新的理论框架,您可以查看Creol语言(已解释)。

答案 3 :(得分:1)

Objective-C的运行时库支持类的动态构造和注册,惰性方法注册和“方法调配”,通过它们可以在运行时切换方法实现。以前的版本支持“类调配”,通过它可以在运行时替换另一个类,但现在使用方法调配。 Here's the reference doc.