【问题标题】:Can you dynamically rename a class name?您可以动态重命名类名吗?
【发布时间】:2017-07-06 16:06:31
【问题描述】:

在 Java 中是否可以在运行时给一个类甚至它的函数一个新名称。通过在程序启动时将新名称作为参数或配置文件读入?

更新:

这是这样做的目的。我正在使用 Java 脚本引擎来允许任何与 JSR 223 兼容的脚本语言访问我们的 API。我们的一些客户不习惯使用 Java 和它的命名约定,使用他们自己的特定命名约定会感觉更舒服。因此,我需要让他们能够动态更改 API 的类和函数名称,而无需在代码中实际更改它们。有人建议我使用 Map 和某种带有字符串名称和实际 Java 名称的绑定,例如,

    map.put("Hello",HelloWorld.class)

    Object obj = new Hello();

应该是一样的,

    Object obj = new HelloWorld();

如果这不可能,请告诉我原因。我需要一个扎实的 Java 专业知识答案。这超出了我的范围,我需要事实来告诉人们为什么这是不可能的,尽管我自己几乎可以肯定这是不可能的。

可能的解决方案:

这是我想出的壁橱解决方案。使用此链接, https://weblogs.java.net/blog/2005/08/10/reflection-and-dynamically-changing-classes 我可以在运行时添加名称,使用组合来创建适配器类,然后编译文件,瞧,脚本语言人员可以使用他们定义的名称而不是我的 API 的 Java 名称。

这是完成此任务的唯一可行方法吗?

更新 2:

对于任何尝试这样做的人来说,这也是另一种可能的解决方案,

http://asm.ow2.org/doc/faq.html

这将带您直接进入他们的常见问题,其中将针对这个确切的问题提供一个。

【问题讨论】:

  • 我不这么认为......但只是想问你为什么需要重命名你的类名?
  • 如果您需要动态名称,可能有比您想的更好的设计模式
  • 听起来像是 XY 问题 (meta.stackexchange.com/questions/66377/what-is-the-xy-problem/…) - 你想做什么/解决什么?
  • 备份。你想解决什么问题?
  • 尝试为类似的东西实现动态类命名是愚蠢的

标签: java


【解决方案1】:

不,您需要重构引用并重新编译执行。

【讨论】:

  • 所以只是澄清一下,即使我想我也不能这样做?不使用 Reflection 或 ScriptEnine 或任何类型的绑定?
  • 这个怎么样? stackoverflow.com/questions/2897685/… 或者仅适用于包。
  • @codeMonkey 你可以用你想要的名字扩展你的所有类,并覆盖所有方法,只在它们上面加上一个超级,但仍然不是在运行时。
  • @codeMonkey 与 ASM 本身并没有重命名类,而是重新创建它。但对于你的海豚来说,它可以工作。
  • 感谢您提供可靠的答案。您上面的第二条评论听起来像是我使用这种技术weblogs.java.net/blog/2005/08/10/… 的想法,但我可以像您所说的那样使用组合或继承并创建一个适配器类。
【解决方案2】:

是的,您可以使用 javassist 做到这一点。 特别是,您必须编辑 NewExpr。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多