在指定位置生成动态代理的.class文件

要生成字节码文件,要在main里额外加一句代码

 

这是生成JDK代理类的字节码文件

//设置
//key来源于ProxyGenerator这个类
System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles","true");//生成的字节码文件保存在working directory

 

public class Test {
    public static void main(String[] args) {
        //setProperty的key在ProxyGenerator类里的saveGeneratedFiles变量里面,
        // 只有下载了完整的ProxyGenerator代码,才能看见参数
        System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFiles","true");

        //参数1:委托类的classloader
        //参数2:委托类实现的所有父接口,getInterfaces能获得类对象的全部父接口
        //参数3:invocationHandler,它的invoke()里就是代理对象执行的方法内容
        // (委托类方法的执行 + 增强)
        BuyBreakFast proxy=(BuyBreakFast) Proxy.newProxyInstance(Son.class.getClassLoader(), Son.class.getInterfaces(), new InvocationHandler() {
            /*proxy:是用newProxyInstance生成的代理对象
             *method:是委托类里的方法
             *args:是委托类里的方法参数
             *Object:是委托类里面函数的返回值*/
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("method:"+method.getName());
                Object invoke = method.invoke(new Son(), args);//执行委托类本身要执行的方法
                System.out.println("一碗蛋酒、一份烤肠"); //做额外的增强
                return invoke;
            }
        });
        proxy.buyBreakFast();//执行代理对象方法,就会调用invocationHandler的invoke()
    }
}

重新运行后,会看见生成$Proxy0.class文件

 

这是生成Cglib代理类的字节码文件

 //保存cglib动态代理生成的字节码文件 
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,
                "D:\\WorkSpace\\j29_workspace\\codes\\day01-design-pattern\\demo5-cglib-dynamic-proxy");//将字节码文件存储在指定绝对路径

 

PS:key是DebuggingClassWriter的DEBUG_LOCATION_PROPERTY属性,value是字节码文件存储路径

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值