其实可以不用那么麻烦去查看,而是可以采用保存class文件的形式来查看
在main方法中的第一行添加如下代码即可:
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"D://"); ```
这样就会保存到d盘,而不用sa-jdi.jar 来查看。
一、CGLib使用示例
package com.wqc.cglib;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class DynamicProxy implements MethodInterceptor {
//真实对象
Object targetObject;
public Object getProxyObject(Object object){
this.targetObject = object;
//增强器,动态代码生成器
Enhancer enhancer = new Enhancer();
//回调方法
enhancer.setCallback(this);
//设置生成类的父类类型
enhancer.setSuperclass(targetObject.getClass());
//动态生成字节码并返回代理对象
return enhancer.create();
}
//拦截方法
@Override
public Object intercept(Object arg0, Method arg1, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("Hello,I am the weaved method before");
Object result = methodProxy.invoke(targetObject,args);
System.out.println("Hello,I am the weaved method after");
return result;
}
}
class RealClass{
public void hah(){
System.out.println("我是真实类要处理的东东,也叫切入点,快来增强我");
}
}
测试类
package Cglib第三方代理;
import java.io.FileOutputStream;
import java.io.IOException;
import org.junit.Test;
import net.sf.cglib.core.DebuggingClassWriter;
import sun.misc.ProxyGenerator;
public class TestCglibMain {
public static void main(String[] args) throws IOException {
RealClass realObject = (RealClass) new DynamicProxy().getProxyObject(new RealClass());
realObject.hah();
System.in.read();
}
}
二、查看代理类源码步骤
-
让程序阻塞(抛出异常会导致程序结束,所以在抛出异常之前阻塞),比如用System.in.read() 或者 Debuger打断点。
-
windows控制台 cd到jdk目录下的lib目录,找到sa-jdi.jar 执行: java -classpath sa-jdi.jar “sun.jvm.hotspot.HSDB”。
-
执行第2步命令后出现如下图片
-
点File—>Attach to hotspot proccess,等待第5步
-
再次在cmd中 执行 jps -l 列出java进程 找到项目进程
-
在第4步中输入进程id后 Tools—>Class Browser,在查找框中输入:RealClass
-
找到CGLIB生成的动态代理类,点击进去,然后再点击create .class File 。 cglib生成的class文件在执行java -classpath sa-jdi.jar 的目录下,然后使用IDEA查看
注意: 不能用Java Decompiler来反编译查看cglib生成的源码。