为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2019-09-24 10:55:22
一个类是否可以在运行时向其自身添加一个方法(例如从一个static块中),以便某人在该类上执行反射时,即使未在编译时定义该方法,他们也会看到该新方法?背景:我使用的框架期望Action按照doAction(...)惯例定义具有方法的类。框架在运行时检查这些类,以查看其doAction()方法中可用的参数类型。例如:doAction(String a,Integer b)我希望每个类都能在检查时及时以编程方式生成doAction()带有各种参数的方法。方法的主体可以为空。
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

这并不简单。一旦由类加载器加载了一个类,就无法更改已加载类的方法。当请求一个类时,一个类加载器将加载它并链接它。而且(使用Java)无法更改链接的代码或添加/删除方法。

我想到的唯一技巧是使用类加载器。如果我们删除一个自定义的类加载器,则该类加载器加载的类也应删除或不可访问。我想到的是

  1. 实现一个自定义类加载器

  2. 加载动态类与定制ClassLoader

  3. 如果我们有此类的更新版本,

  4. 删除自定义类加载器并

  5. 使用自定义类加载器的新实例加载此类的新版本

我将其留为思考的食物,无法证明,如果这导致解决方案或我们有陷阱。

作为对问题的简单回答:不,我们不能像在反射中更改字段内容那样更改已加载的类。(我们也无法添加或删除字段)。


查看完整回答
反对 回复 2019-09-24
?
冉冉说

TA贡献1877条经验 获得超1个赞

不,在Java中不可能(轻松)实现。

听起来好像您在尝试使用Java,就像它是一种动态编程语言一样。例如,Ruby具有开放类:您可以在运行时从Ruby类中添加和删除方法。在Ruby中,您的类中也可以有一个“缺少方法”的方法,当您尝试调用该类中不存在的方法时,该方法将被调用。Java中也不存在这样的东西。

有一个在JVM上运行的Ruby版本,即JRuby,它必须执行非常困难的技巧才能使开放类在JVM上工作。


查看完整回答
反对 回复 2019-09-24
  • 3 回答
  • 0 关注
  • 1040 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信