查看生成的cglib代理类源码详解

原文:Cglib动态代理反编译生成类

其实可以不用那么麻烦去查看,而是可以采用保存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();
	}
}

二、查看代理类源码步骤

  1. 让程序阻塞(抛出异常会导致程序结束,所以在抛出异常之前阻塞),比如用System.in.read() 或者 Debuger打断点。

  2. windows控制台 cd到jdk目录下的lib目录,找到sa-jdi.jar 执行: java -classpath sa-jdi.jar “sun.jvm.hotspot.HSDB”。

  3. 执行第2步命令后出现如下图片
    查看生成的cglib代理类源码详解_第1张图片

  4. 点File—>Attach to hotspot proccess,等待第5步

  5. 再次在cmd中 执行 jps -l 列出java进程 找到项目进程

  6. 在第4步中输入进程id后 Tools—>Class Browser,在查找框中输入:RealClass
    查看生成的cglib代理类源码详解_第2张图片

  7. 找到CGLIB生成的动态代理类,点击进去,然后再点击create .class File 。 cglib生成的class文件在执行java -classpath sa-jdi.jar 的目录下,然后使用IDEA查看
    查看生成的cglib代理类源码详解_第3张图片
    注意: 不能用Java Decompiler来反编译查看cglib生成的源码。

你可能感兴趣的:(Java,源码分析)