Java类可以在运行时为其自身添加方法吗?

一个类是否可以在运行时向其自身添加一个方法(例如从一个static块中),以便某人在该类上执行反射时,即使未在编译时定义该方法,他们也会看到该新方法?

背景:

我使用的框架期望Action按照doAction(...)惯例定义具有方法的类。框架在运行时检查这些类,以查看其doAction()方法中可用的参数类型。例如:doAction(String a,Integer b)

我希望每个类都能在检查时及时以编程方式生成doAction()带有各种参数的方法。方法的主体可以为空。


慕斯709654
浏览 1137回答 3
3回答

慕尼黑8549860

这并不简单。一旦由类加载器加载了一个类,就无法更改已加载类的方法。当请求一个类时,一个类加载器将加载它并链接它。而且(使用Java)无法更改链接的代码或添加/删除方法。我想到的唯一技巧是使用类加载器。如果我们删除一个自定义的类加载器,则该类加载器加载的类也应删除或不可访问。我想到的是实现一个自定义类加载器加载动态类与定制ClassLoader如果我们有此类的更新版本,删除自定义类加载器并使用自定义类加载器的新实例加载此类的新版本我将其留为思考的食物,无法证明,如果这导致解决方案或我们有陷阱。作为对问题的简单回答:不,我们不能像在反射中更改字段内容那样更改已加载的类。(我们也无法添加或删除字段)。

冉冉说

不,在Java中不可能(轻松)实现。听起来好像您在尝试使用Java,就像它是一种动态编程语言一样。例如,Ruby具有开放类:您可以在运行时从Ruby类中添加和删除方法。在Ruby中,您的类中也可以有一个“缺少方法”的方法,当您尝试调用该类中不存在的方法时,该方法将被调用。Java中也不存在这样的东西。有一个在JVM上运行的Ruby版本,即JRuby,它必须执行非常困难的技巧才能使开放类在JVM上工作。
打开App,查看更多内容
随时随地看视频慕课网APP