查看动态代理生成的代理类字节码
文章目錄
- 動態代理的知識介紹
- 用java proxy實現動態代理
- 查看生成的class代理類字節碼
- 創建代理的源碼
動態代理的知識介紹
一、動態代理和Class字節碼的關系
動態代理有什么作用及應用場景?
1.日志集中打印
2.事務
3.權限管理
4.AOP
在Spring Aop當中可以哪些方式實現,及區別?
l.java Proxy(動態構建字節碼)(動態構建全新字節碼bean初始化的時候)
2.cglib(動態構建字節碼)(動態構建全新字節碼bean初始化的時候)
3.Aspecti(修改目標類的字節,織入代理的字節,在程序編譯(編譯的時候插入動態代理的字節碼,不會生成全新的Class)
4.instrumentation(修改目標類的字節碼、類裝載的時候動態攔截去修改,基于iavaagent)-javaagent:spring-instrument-4.3.8.RELEASE.jar(類裝載的時候插入動態代理的字節碼,不會生成全新的Class)
關于實現動態代理的技術:
1.動態代理可以由java proxy、cglib、instrumentation(javaagent)、Aspectj、等多種方式實現
2.動態代理本質是對class字節碼進行動態構建或修改。
3.修改的工具有ASM、javavssist
4.多種實現方式的區別在于對字節碼切入方式不一樣。可選方式的有:
java proxy、Cglib是基于動態構建接口實現類字節
AspectJ是借助Eclipse工具在編譯時織入代理字節
instrumentation是基于javaagent在類裝載時修改Class織入代理字節
使用字定義ClassLoader在裝載時織入代理字節JAVA Proxy實現過程
動態代理技術棧圖:
用java proxy實現動態代理
一個簡單實現的例子:
public interface User {String getName(String name); }```java public class Userimpl implements User{@Overridepublic String getName(String name) {System.out.println("實現類");return name;} } ```java public class UserProxy {public static void main(String[] args) {final Userimpl userimpl = new Userimpl();User targetproxy = (User) Proxy.newProxyInstance(UserProxy.class.getClassLoader(), new Class[]{User.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] myargs) throws Throwable {System.out.println("q我是前置");try {return method.invoke(userimpl,myargs);} finally {System.out.println("后置");}}}); targetproxy.getName("hzy");} }查看生成的class代理類字節碼
public static void buildProxy() throws IOException {byte[] bytes = ProxyGenerator.generateProxyClass("User$proxy",new Class[]{User.class});String fileName = System.getProperty("user.dir")+"\\target\\UserService$proxy.class";File file = new File(fileName);FileOutputStream fileOutputStream = new FileOutputStream(file);fileOutputStream.write(bytes);fileOutputStream.flush();fileOutputStream.close();}在上面的main函數中加上 buildProxy()方法,執行后查看文件目錄:
可以看到生成的class文件
把文件拖到idea里面,可以看到反編譯后的文件:
創建代理的源碼
首先是newProxyInstance方法:
可以看到進入了這句 Class<?> cl = getProxyClass0(loader, intfs);//尋找或者生成目標代理類
這個注釋的意思:如果由實現給定接口的給定加載器定義的代理類存在,這將簡單地返回緩存副本;否則,它將通過 ProxyClassFactory 創建代理類,即判斷這個接口是不是已經裝載class,如果有則直接返回
之后還有apply方法、proxyfactory中的方法等等,比較復雜,以后再仔細學。
總結
以上是生活随笔為你收集整理的查看动态代理生成的代理类字节码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring整合dubbo服务消费和发现
- 下一篇: 用redis+jwt保存在线用户和获得在