是否可以使用以下内容更改检索到的类的名称:Foo.class.getName()
(或getSimpleName()
或getCanonicalName()
)。
我知道这些方法是java.lang.Class<T>
的一部分。如果有办法告诉java.lang.Class<T>
我希望它为我的班级显示的名称,问题本身就是问题。
我知道它打开了通往棘手事物的大门。因为反射库使用该名称来做&#34; stuff&#34;和bla bla bla。然而,我想知道是否可以打电话给Foo.class.getSimpleName()
并获得类似MyFoo
的内容。
所有这一切当然都没有字符串操作,这是我的最后一种选择。
答案 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
的类。