高新代理( 二 )


代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标返回的结果外 , 还可以在
代理方法中的如下四个位置加上系统功能代码:
1.在调用目标方法之前
2.在调用目标方法之后
3.在调用目标方法前后
4.在处理目标方法异常的catch块中
分析JVM动态生成的类:
创建实现了接口的动态类和查看其名称 , 分析Proxy.方法的各个参数 。
编码列出动态类中的所有构造方法和参数签名
编码列出动态类中的所有方法和参数签名
创建动态类的实例对象
用反射获得构造方法
编写一个最简单的类
调用构造方法创建动态类的实例对象 , 并将编写的类的实例对象传进去
打印创建的对象和调用对象的没有返回值的方法和方法 , 演示调用其他有返回值的方法报告了异常 。
将创建动态类的实例对象的代理改成匿名内部类的形式编写 , 锻炼大家习惯匿名内部类 。
总结思考:让jvm创建动态类及其实例对象 , 需要给它提供哪些信息?
三个方面:
1.生成的类中有哪些方法 , 通过让其实现哪些接口的方式进行告知;
2.产生的类字节码必须有个一个关联的类加载器对象;
3.生成的类中的方法的代码是怎样的 , 也得由我们提供 。把我们的代码写在一个约定好了接口对象的方法中 , 把
对象传给它 , 它调用我的方法 , 即相当于插入了我的代码 。提供执行代码的对象就是那个
对象 , 它是在创建动态类的实例对象的构造方法时传递进去的 。在上面的对象的方
法中加一点代码 , 就可以看到这些代码被调用运行了 。
用Proxy.方法直接一步就创建出代理对象 。
代码示例:
private static Object getProxy(final Object target,final Advice advice) {Object proxy3 = Proxy.newProxyInstance(target.getClass().getClassLoader(),//new Class[]{Collection.class},target.getClass().getInterfaces(),new InvocationHandler(){public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {// TODO Auto-generated method stub//long beginTime = System.currentTimeMillis();//Object retVal = method.invoke(target, args);//long endTime = System.currentTimeMillis();//System.out.println("retVal run of " +(beginTime-endTime));//return retVal;advice.beforeMethod(method);Object retVal = method.invoke(target, args);advice.afterMethod(method);return retVal;}});return proxy3;
猜想分析动态生成的类的内部代码
动态生成的类实现了接口(可以实现若干接口) , 生成的类有接口中的所有
方法和一个如下接受参数的构造方法 。
构造方法接受一个对象 , 接受对象了要干什么用呢?该方法内部的
代码会是怎样的呢?
实现接口的动态类中的各个方法的代码又是怎样的呢?接
口中定义的方法接受的三个参数又是什么意思?图解说明如下:
图片:

高新代理

文章插图
分析先前打印动态类的实例对象时 , 结果为什么会是null呢?调用有基本类型返回值的方法时为什么会
出现异常?
分析为什么动态类的实例对象的()方法返回了正确结果呢?
调用调用代理对象的从类继承的, , 或这几个方法时 , 代理对象将调用请求转
发给对象 , 对于其他方法 , 则不转发调用请求 。
分析动态代理的工作原理图
怎样将目标类传进去?