Cglib动态代理反编译生成类

JDK的反编译较为简单,看本机源代码

1.下面是代理类和真实类的源代码

package 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("我是真实类要处理的东东,也叫切入点,快来增强我");
	}
}

2.下面是测试类的源代码

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 {
	
//	RealClass realObject = (RealClass) new DynamicProxy().getProxyObject(new RealClass());
//	@Test
//	public void test() throws IOException{
//		realObject.hah();
		//System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "H:\\Hadoop_eclipse\\eclipse-jee-mars-2-win32-x86_64\\剑指Offer\\反射详解\\bin\\cgliballclass");
		
		
//		String path = "H:/Hadoop_eclipse/eclipse-jee-mars-2-win32-x86_64/剑指Offer/反射详解/bin/cgliballclass/$proxy1.class";
//		byte[] classFile = //new byte[1024]; 
//				ProxyGenerator.generateProxyClass("$Proxy1",
//						realObject.getClass().getClasses());
//        FileOutputStream out = null;
//
//        try {
//            out = new FileOutputStream(path);
//            out.write(classFile);
//            out.flush();
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                out.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
			
		
		
//	}
	public static void main(String[] args) throws IOException {
		RealClass realObject = (RealClass) new DynamicProxy().getProxyObject(new RealClass());
		realObject.hah();
		//System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "H:\\Hadoop_eclipse\\eclipse-jee-mars-2-win32-x86_64\\剑指Offer\\反射详解\\bin\\cgliballclass");
		System.in.read();
	}
}

1.首先在主测试类后加上System.in.read()阻塞程序

2.打开cmd 执行

 java -classpath "C:\Program Files\Java\jdk1.8.0_144\lib\sa-jdi.jar" sun.jvm.hotspot.HSDB,再弹出的窗口中选择File->Attach to HotSpot process

3.此时再开一个cmd窗口,输入jps -l,查看运行中的java程序

将主类ID输入到上面process ID中,点击确认进入

4.进入界面后选择Tools->Class Browser

点击上面第二项,就创建 好了

然后在下面红线文件夹下寻找

猜你喜欢

转载自blog.csdn.net/qq_27378875/article/details/81407989