【问题标题】:In Class.forName got ClassNotFoundException when obfuscating in j2me在 J2me 中进行混淆时,在 Class.forName 中得到 ClassNotFoundException
【发布时间】:2011-02-25 13:44:29
【问题描述】:

我可以运行以下示例代码

//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 。在附加混淆设置中,我添加了 -keepnames 类 org.test.Menu。但仍然无法正常工作。有什么解决办法吗?

【问题讨论】:

  • 也许你可以看看混淆后的代码看看发生了什么。

标签: java java-me obfuscation


【解决方案1】:

微不足道的原因:混淆器将 org.test.Menu 的名称更改为其他名称(包名称已更改和/或类名已更改)。并且混淆器不能“重构”类,因此其他类文件中基于字符串的类名也会被更改。

如果是这种情况,请告诉混淆器不要触摸 org.test 包(保留该名称并且不要混淆内部类的名称)。

【讨论】:

  • +1 - 最后一句给出了 OP 的“修复”。他将如何做到这一点将取决于他使用的混淆器。
  • 我正在使用 netbean 6.9.1 。在附加混淆设置中,我添加了 -keepnames 类 org.test.Menu。但仍然无法正常工作。有什么解决办法吗?
  • 在使用 -keepnames 选项混淆之后 - 你的类路径中有文件 ./org/test/Menu.class 吗?
  • 是的,我得到了我使用的解决方案 -keep public class org.test.Menu
【解决方案2】:

这是设计使然。混淆会更改所有公共标识符的名称(包括类名),因此如果您通过字符串(如Class.forName 或其他形式的反射)引用它们中的任何一个,尤其是您计算的字符串( "org.test." + a) 会坏掉的。

如果您需要通过Class.forName 按需加载Menu,那么您不能混淆Menu 类。

自从我查看混淆器以来已经 很长 时间了,但是如果您以特定方式标记它们,IIRC 有些可能会为您重写一些字符串;检查您正在使用的文档,看看是否可以。但即便如此,他们也不太可能为您重写 "org.test." + a 之类的内容。您必须将全名放在一个字符串中。

【讨论】:

  • 我想动态创建对象,类名每次都不一样。请问有什么解决办法吗?
  • @user:只有上面的两个解决方案:不要混淆你试图创建的类,或者使用你的混淆器的功能(如果有的话)重写字符串版本的在字节码中为您命名。
【解决方案3】:

Obfuscation 更改令牌、标识符,以便找不到名称的硬编码字符串 ("org.test.Menu")。

【讨论】:

    【解决方案4】:

    混淆会更改类的名称,因此类 Menu 的名称将更改为其他名称。

    【讨论】:

      【解决方案5】:

      当您混淆代码时,它会更改类名 a,b' 等等..

      【讨论】:

      • “在混淆状态下检查确切的类名” 嗯,是的,但你不能指望它从混淆到混淆都是一样的,对吗?我的意思是,如果您在此期间进行任何更改,则不会。
      • @T.J.啊..是的,我们不应该对此进行转发。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多