是否可以更改Class.getName()的输出?

时间:2015-05-10 20:59:30

标签: java class

是否可以更改MyClass.class.getName()的输出?例如:

public class MyClass {
}

public static main(String args[]) {
    System.out.println(MyClass.class.getName());
}
  1. 输出不应该是'MyClass'而是'what'。这是 可能?
  2. 此外:如果我们可以将输出更改为“what”, 我们可以完全控制对Myclass.class.getName()的调用, 类似于覆盖方法?
  3. 为什么我要问:我有一个程序(我无法控制)动态加载MyClass(MyClassLoader.loadClass('MyClass'))并调用MyClass.class.getName()

    编辑: 我最好重申一些事实清楚:

    -MyClass由具有Class new_class = loadClass('MyClass')的类加载器动态加载。我无法更改此代码,这不是问题的一部分。

    - 接下来发生的事情:System.out.println(new_class.class.getName()) ---&GT;问题:此调用转到java.lang.Class<T>.getName(),当然会返回'MyClass'。有没有办法改变输出?

1 个答案:

答案 0 :(得分:1)

  

输出不应该是&#39; MyClass&#39;而不是&#39;无论如何&#39;。这可能吗?

不。

当然不是纯Java。

我正在努力想出一种使用字节码工程或类加载器hackery在理论上可能的方法。 (在加载之前,您可能会使用字节码工程将类名更改为something,但它不会使用旧名称MyClass加载。)

这扇门被关上的原因之一是#34;是类名与它们的身份密切相关......这与Java运行时类型的安全性和安全性密切相关。如果你能&#34; hack&#34;这样,就有可能导致安全漏洞。

建议:考虑另一种方法,这样你就不会有这个要求。