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

Programming languages 哪些框架(和相关语言)支持类替换?,programming-languages,frameworks,aop,classloader,dynamic-class-loaders,Programming Languages,Frameworks,Aop,Classloader,Dynamic Class Loaders,我正在写我的硕士论文,主要研究.NET中的AOP,以及其他内容,我还提到,在加载时缺乏对替换类的支持,这是一个重要因素,因为目前没有.NET AOP框架能够执行真正的动态编织——这需要编织类必须扩展ContextBoundObject或MarshalByRefObject或公开其所有属性接口上的语义 不过,由于ClassFileTransformer,您可以在JVM中使用Java实现这一点: 您可以扩展ClassFileTransformer 您可以订阅类加载事件 在类加载时,重写类并替换它

我正在写我的硕士论文,主要研究.NET中的AOP,以及其他内容,我还提到,在加载时缺乏对替换类的支持,这是一个重要因素,因为目前没有.NET AOP框架能够执行真正的动态编织——这需要编织类必须扩展
ContextBoundObject
MarshalByRefObject
或公开其所有属性接口上的语义

不过,由于
ClassFileTransformer
,您可以在JVM中使用Java实现这一点:

  • 您可以扩展
    ClassFileTransformer
  • 您可以订阅类加载事件
  • 在类加载时,重写类并替换它
所有这些都很好,但我的项目主管在最后一分钟要求我给他一个支持/不支持类替换的框架(和相关语言)列表。我现在真的没有时间去寻找这个问题:仅仅做一个肤浅的研究,并在我的论文中潜在地加入错误的信息,我会感到不舒服

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

非常感谢


编辑:@ewernli

  • 我问的是(2)
  • 在C#中,确实可以在运行时发出代码并动态创建新类,但它们是新类,不能替换现有类。我想做的是在加载时转换类,就像在Java中使用
    ClassFileTransformer
    所做的那样
  • 关于修改方法的签名:是的,你是对的。我应该提到,在我的例子中,我不想修改类的接口,而是修改它的方法的内容
你的回答真的很有帮助。谢谢:)

Java语言不支持类文件替换。JVM通过您提到的类公开该特性。因此,所有人都可以利用它。

您是在询问(1)运行时真正的类替换,还是(2)加载类时转换类的功能,还是(3)支持动态类加载的语言

Java支持使用
ClassLoader
动态加载类,使用
ClassFileTransformer
进行转换,但不支持真正的类替换

我不确定C#,但我认为可以在运行时发出代码并动态创建新类,这样就可以实现(3)和(2)

真正的类替换主要由动态语言支持,例如Smalltalk、Ruby、我猜Python和其他一些语言。这需要转换类的实例以匹配新形状。如果类发生更改,它们通常将新字段初始化为nil

另外,移植到JVM的动态语言对类加载器进行了大量的攻击,以支持在运行时替换类。对于JRuby,请参阅以获取更多的指针,了解他们现在是如何做的,有什么问题,以及即将推出的
invokedynamic
可能会有什么帮助

这在静态类型语言中不提供,因为类型系统的复杂性。如果一个类中的方法签名发生了更改,那么已经加载的其他现有类可能不需要遵守新的方法签名,这是不安全的。但是,在java中,只要签名相同,就可以使用

有人试图将此功能添加到Java和/或静态类型语言中:

  • 对类型安全的动态Java类的运行时支持
  • 支持应用程序行为的意外动态适应
  • 一种Java软件动态更新技术
本文概述了相关问题

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

不确定这是否解决了你们最初的问题,但这些指针对你们的论文来说可能很有趣

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

Objective-C的运行库支持类的动态构造和注册、惰性方法注册和“方法swizzling”通过该方法可以在运行时切换实现。以前的版本支持“类swizzling”,通过它可以在运行时用一个类替换另一个类,但现在改用方法swizzling

是的,谢谢。我经常忘记区分语言和框架。(我知道,这是一个很大的区别)。那很有帮助,谢谢。我会修改这个问题使它更准确。但是,您知道那些已经移植到JVM的其他语言是否利用了它吗?我的意思是:他们提供了任何方法来取代一门课吗?这是一个很好的答案:),谢谢!我编辑了我的问题以回答你的一些观点。谢谢你的资源,它们真的很有用。谢谢:)[愚蠢的15个字符限制,抱怨抱怨]太好了,谢谢你的解释和链接!你们真的在帮我:)