欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Cglib动态代理反编译生成类

程序员文章站 2022-06-18 10:35:39
...

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

Cglib动态代理反编译生成类

Cglib动态代理反编译生成类

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

Cglib动态代理反编译生成类

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

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

Cglib动态代理反编译生成类

Cglib动态代理反编译生成类

Cglib动态代理反编译生成类

Cglib动态代理反编译生成类

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

Cglib动态代理反编译生成类

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

Cglib动态代理反编译生成类

相关标签: Cglib