更改班级的名称

时间:2015-07-17 03:24:27

标签: java naming-conventions

是否可以使用以下内容更改检索到的类的名称:Foo.class.getName()(或getSimpleName()getCanonicalName())。

我知道这些方法是java.lang.Class<T>的一部分。如果有办法告诉java.lang.Class<T>我希望它为我的班级显示的名称,问题本身就是问题。

我知道它打开了通往棘手事物的大门。因为反射库使用该名称来做&#34; stuff&#34;和bla bla bla。然而,我想知道是否可以打电话给Foo.class.getSimpleName()并获得类似MyFoo的内容。

所有这一切当然都没有字符串操作,这是我的最后一种选择。

2 个答案:

答案 0 :(得分:1)

在JDK中找到src.zip。将java/lang/Class.java解压缩到某个目录并修改getSimpleName()方法。例如:

public String getSimpleName() {
    return "MyName"; // return MyName for any class
}

使用javac正常编译(你会得到很多警告,忽略它们)。删除创建的所有其他类,如Class$1.class,只保留java/lang/Class.class个文件。把它放进罐子里:

$ jar -c java >myclass.jar

现在在你的新jar前面添加bootstrap路径。例如,让我们考虑一下这个测试类:

public class Test {
   public static void main(String[] args) {
      System.out.println(Test.class.getSimpleName());
   }
}

$ java Test
Test

$ java -Xbootclasspath/p:myclass.jar Test
MyName

我甚至不想解释它有多危险。同样根据Oracle binary code license(补充术语F),您无法以这种方式部署您的应用程序。

答案 1 :(得分:0)

您可以尝试Powermock根据其主页允许模拟final类,尽管它需要使用它自己的类加载器。

其他不使用自定义类加载器(如Mockito和Easymock)进行字节代码操作的模拟框架无法使用final java.lang.Class的类。