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
3.此时再开一个cmd窗口,输入jps -l,查看运行中的java程序
将主类ID输入到上面process ID中,点击确认进入
4.进入界面后选择Tools->Class Browser
点击上面第二项,就创建 好了
然后在下面红线文件夹下寻找
上一篇: 从初创公司到AI独角兽,商汤科技在四年里做了些什么?
下一篇: Java反射
推荐阅读
-
java动态代理(jdk与cglib)详细解析
-
详解java JDK 动态代理类分析(java.lang.reflect.Proxy)
-
在python的类中动态添加属性与生成对象
-
详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理
-
PHP使用GIFEncoder类生成gif动态滚动字幕
-
Spring学习之动态代理(JDK动态代理和CGLIB动态代理)
-
详解Spring的两种代理方式:JDK动态代理和CGLIB动态代理
-
PHP使用GIFEncoder类生成gif动态滚动字幕
-
Spring学习之动态代理(JDK动态代理和CGLIB动态代理)
-
PHP使用GIFEncoder类生成的GIF动态图片验证码