在J2me中进行模糊处理时,Class.forName得到了ClassNotFoundException

时间:2011-02-24 13:10:22

标签: java java-me obfuscation

我可以运行以下示例代码

//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。但仍然没有工作。任何解决方案?

5 个答案:

答案 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)

当您对代码进行模糊处理时,它会更改某些 ab'等类名称。

答案 3 :(得分:0)

Obfuscation更改标记,标识符,以便找不到您的硬编码字符串("org.test.Menu")。

答案 4 :(得分:0)

模糊处理会更改类的名称,因此类Menu的名称将更改为其他名称。