java修改class问题

我在这个帖http://blog.csdn.net/hexin373/article/details/6669813里做时不知道怎么搞第七步,希望有高手吧做好的工程文件发给我或者教我

不用那么复杂,最简单的做法如下,
第一步,确定元代码编译版本。小版本不重要,至少大版本要对。
第二步,在eclipse中建立工程,将编译环境和元环境相同,将这个jar包和jar包依赖的jar包都作为依赖的lib。
第三步, 按class要求建立package和 java文件(只要你修改的那个就行了),黏贴反编译的代码,然后修改。
第四步, 只要编译通过,去classes目录将那个class文件复制到jar包中就可以了。

不过需要注意: 1 所有常量在反编译的class中会直接显示值,不会是指向常量文件(其实无所谓,直接改就是了)
2 行数和源代码不符合了。源代码注释是占行数的,在反编译中没有注释内容的。
3 某些代码无法反编译。例如混淆,或者版本较高。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-09-10

反编译看到关键的方法调用(比如我想抹掉验证 License Key 的代码)之后我们可以通过 AOP around advice 替换掉它,这样就不需要直接修改源代码和原来的jar文件,如果它原来的 jar 有数字签名的话,我们把它解压后再重新打包成 jar 文件(去掉签名和 MANIFEST.MF 中的 Sealed 声明) 。


可以学习一下 AspectJ 的入门,它提供 around advice 支持,例如下面这段代码,当然了,我们需要先反编译原来的代码知道哪个类和方法与此相关,这样才能写出我们期望的 pointcut ,这里的 pointcut 就是“程序执行流中的某个时刻,比如一个方法调用,一个异常被抛出,一个成员变量的值被读取或修改,一个 static 初始化块,一个构造方法被调用等。

而 advice 则是指当某个 pointcut 命中的程序执行流的时刻我们对它进行干预,一般分3种类型,before, after, around,其中 before 和 after 并不能阻止原来的那个程序执行流被执行,但 around advice 则可以。


//假设原来有这样一段代码验证,我们想办法把这个方法内的那个验证 MAC 地址的调用抹掉。
boolean verify() {
  return LicenseUtil.checkLic(MACAddress);
}

// 定义一个 pointcut.
pointcut verifyPointcut() :
   execution(public boolean LicenseUtil.checkLic(..));

//给指定的 pointcut 提供一个 around advice 并且不要调用 proceed() 来完全替换掉原来的代码调用。
void around() : verifyPointcut() {
    return true;
    // 如果我们 proceed(); 就表示还是调用原来那个 LicenseUtil.checkLic();
}


QQ 空间介绍(用 Base 64 解码链接):

aHR0cDovL3VzZXIucXpvbmUucXEuY29tLzg5NjA1NzMzNy8y

相似回答