记一次jdk动态代理动态分析

一、先定义一个动态代理类实现 InvocationHandler类,实现invoke方法

 

因为java动态代理是基于接口实现动态代理,所以被代理的类必须要基于某个接口

 

 

结果如下:

生成关键:

 

Proxy中的newProxyInstance()方法

在proxy中的getProxyClass0方法中,先去判断缓存中有无该对象

在proyClassCache.get()中关键点调动的apply()方法

最后实际调用的Proxy.apply()方法

调用ProxyGenerator.generateProxyClass(

     proxyName, interfaces, accessFlags)生成代理对象

 

接下来验证生成的生成的类

通过ProxyGenerator.generateProxyClass()可以获取到生成的代理类字节码,并写入到本地

反编译查看详情

重点就是执行的InvocationHandler中的方法

接下来我们加载下刚刚生成代理类

 

一起执行结果如下:

代码如下:

public static void main(String[] args) throws Exception {
    Student student = new StudentImpl();

    Student studentProxy = (Student) Proxy.newProxyInstance(student.getClass().getClassLoader(),
            new Class[]{Student.class},
            (Object proxy, Method method, Object[] argss) -> {
                System.out.println("我是内存中的前置");
                method.invoke(student);
                return proxy;
            });
    studentProxy.getStudent();

    String studentProxyClassName = studentProxy.getClass().toString();
    studentProxyClassName = studentProxyClassName.substring(studentProxyClassName.lastIndexOf(".") + 2);
    byte[] bytes = ProxyGenerator.generateProxyClass(studentProxyClassName,new Class[]{Student.class});
    Files.write(Paths.get("/Volumes/Mac/www/"+studentProxyClassName+".class"),bytes);


    URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("file:/Volumes/Mac/www/")});
    Class<?> proxy = classLoader.loadClass("Proxy0");
    Constructor<?> declaredConstructors = proxy.getConstructor(InvocationHandler.class);
    Student student1 = (Student) declaredConstructors.newInstance(new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] argss) throws Throwable {
            System.out.println("我是加载class文件的前置");
            method.invoke(student, argss);
            return proxy;
        }
    });
    student1.getStudent();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值