我可以运行以下示例代码
//main class
String a="Menu";
Object o = Class.forName("org.test."+a).newInstance();
//Menu class
public class Menu()
{
public Menu()
{
System.out.println("con called");
}
}
它运行正常,但是当我对代码进行模糊处理时,我得到一个没有 ClassNotFoundException 。
我使用的是netbean 6.9.1。在附加的obfusating设置中,我添加了-keepnames类org.test.Menu。但仍然没有工作。任何解决方案?
答案 0 :(得分:5)
微不足道的原因:混淆器将org.test.Menu
的名称更改为其他名称(更改了包名称和/或更改了类名称)。并且混淆器不能“重构”类,以便其他类文件中基于String的类名也会被更改。
如果是这种情况,请告诉混淆器不要触摸org.test
包(保留该名称,不要混淆其中的类名)。
答案 1 :(得分:1)
这是设计的。混淆会更改所有公共标识符(包括类名)的名称,因此,如果您通过字符串(例如使用Class.forName
或其他形式的反射)引用其中任何一个,尤其是字符串,那么计算("org.test." + a
)将会破坏。
如果您需要通过Menu
请求加载Class.forName
,则无法对Menu
类进行模糊处理。
自从我查看混淆器以来,这是长时间,但是如果你以特定的方式标记它们,IIRC可能会为你重写一些字符串;检查您正在使用的文档上的文档,看它是否可以。但即便如此,他们也不太可能为你重写像"org.test." + a
这样的东西。您必须在一个字符串中使用全名。
答案 2 :(得分:0)
当您对代码进行模糊处理时,它会更改某些 a
,b
'等类名称。
答案 3 :(得分:0)
Obfuscation更改标记,标识符,以便找不到您的硬编码字符串("org.test.Menu"
)。
答案 4 :(得分:0)
模糊处理会更改类的名称,因此类Menu的名称将更改为其他名称。