Java查看动态代理生成的字节码文件

很多小伙伴们可能在学习动态代理的时候,表示看不到JDK动态代理生成的代理类的字节码文件,表示很多理论无法去证实,所以今天给各位小伙伴们带来一个方法查看。

public static void buildProxy() throws IOException {

    // 填写需要动态代理的接口
    byte[] bytes = ProxyGenerator.generateProxyClass("$proxy",new Class[]{Liha.class});
    
    // 我这里是直接用Idea创建的Java项目
    // 如果是maven构建的项目记得把下面的out变成target
    String fileName = System.getProperty("user.dir")+"\\out\\$proxy.class";
    File file = new File(fileName);
    FileOutputStream fileOutputStream = new FileOutputStream(file);
    fileOutputStream.write(bytes);
    fileOutputStream.flush();
    fileOutputStream.close();
}

我这里是直接用Idea创建的Java项目所以是out文件

如果是maven构建的项目记得把的out变成target

整体代码如下:

/**
 * @Author liha
 * @Date 2022-03-16 21:17
 * 李哈YYDS
 */
public class TestProxy {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, IOException {

        // 获取到代理class对象
        Class proxyClass = Proxy.getProxyClass(TestProxy.class.getClassLoader(), Liha.class);

        // 创建自定义的InvocationHandler
        InvocationHandler invocationHandler = new MyTestInvocationHandler();

        // 通过class模板反射获取到代理对象
        Liha liha = (Liha)proxyClass.getConstructor(InvocationHandler.class).newInstance(invocationHandler);

        // 走的是代理对象的方法。
        liha.out();

        buildProxy();
    }

    public static void buildProxy() throws IOException {
        byte[] bytes = ProxyGenerator.generateProxyClass("$proxy",new Class[]{Liha.class});
        String fileName = System.getProperty("user.dir")+"\\out\\$proxy.class";
        File file = new File(fileName);
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write(bytes);
        fileOutputStream.flush();
        fileOutputStream.close();
    }
}

class MyTestInvocationHandler implements InvocationHandler{

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName());
        return null;
    }
}

interface Liha{

    void out();

}

运行后会在target或者out文件中存在一个$Proxy0.class文件

Java查看动态代理生成的字节码文件_第1张图片

大功告成,这就是接口生成的代理类的字节码被Idea反编译后样子。

如果有小伙伴想追一下JDK动态代理的底层不妨看一下笔者的来帮助理解~!

从源码角度解读JDK动态代理icon-default.png?t=M276https://blog.csdn.net/qq_43799161/article/details/123536547

你可能感兴趣的:(环境搭建,插件的使用,java,intellij-idea,maven,后端,代理模式)