黑马程序员----JAVASE高级部分之动态代理
来源:互联网 发布:象棋打谱软件 编辑:程序博客网 时间:2024/06/06 03:04
1. InvocationHandler:该接口中仅定义了一个方法即:
invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,
method是被代理的方法,args为该方法的参数数组。
2. Proxy:该类即为动态代理类,其中主要包含以下内容:
* protected Proxy(InvocationHandler handler):构造函数,估计用于给内部的h赋值。
* static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组。
* static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用.
package cn.itheima.proxy;public interface TargerInterface {public String getMessage();public void printMessage();}
package cn.itheima.proxy;public class TargerClass implements TargerInterface{public String getMessage() {return "黑马程序员";}public void printMessage() {System.out.println("黑马程序员");}}
package cn.itheima.proxy;import java.lang.reflect.Proxy;import java.util.ArrayList;public class InvocationHandleClient {public static void main(String[] args) {TargerClass target = new TargerClass();Advice advice = new Advice();MyInvocationHandle myInvocationHandle = new MyInvocationHandle(target,advice);TargerInterface proxy = (TargerInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), myInvocationHandle);System.out.println(proxy.getMessage());}}
package cn.itheima.proxy;public class Advice {public void beforeMethod(){System.out.println("------before method--------");}public void afterMethod(){System.out.println("---------after method----------");}}
package cn.itheima.proxy;import java.lang.reflect.Proxy;import java.util.ArrayList;public class InvocationHandleClient {public static void main(String[] args) {TargerClass target = new TargerClass();Advice advice = new Advice();MyInvocationHandle myInvocationHandle = new MyInvocationHandle(target,advice);TargerInterface proxy = (TargerInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), myInvocationHandle);System.out.println(proxy.getMessage());}}
JDK的动态代理必须具备四个条件:
目标接口
目标类
拦截器
代理类
总结:
1、因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有。
2、生成的代理类的所有的方法都拦截了目标类的所有的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成体。
3、利用JDKProxy方式必须有接口的存在。
4、invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型。
- 黑马程序员----JAVASE高级部分之动态代理
- 黑马程序员----JAVASE高级部分之反射
- 黑马程序员----JAVASE高级部分之注解
- 黑马程序员----JAVASE高级部分之泛型
- 黑马程序员----JAVASE高级部分之JavaBean与内省
- 黑马程序员——反射高级应用之动态代理
- 黑马程序员----JAVASE高级部分之类加载器
- 黑马程序员-----代理之动态代理总结*
- 黑马程序员--java之动态代理
- 黑马程序员:基础加强之动态代理
- 黑马程序员--加强之动态代理
- 黑马程序员---高新技术之动态代理类
- 黑马程序员--高新技术之动态代理
- 黑马程序员_java高新技术之动态代理
- 黑马程序员---高新技术之动态代理类
- 黑马程序员----高新技术----之动态代理
- 黑马程序员 动态代理
- 黑马程序员-动态代理
- 黑马程序员----JAVASE之正则表达式
- 11.17C程序设计语言---字符指针与函数
- Unicode
- opencv学习-pca人脸识别
- OGNL表达式struts2标签“%,#,$”
- 黑马程序员----JAVASE高级部分之动态代理
- 浏览器兼容性调整(非原创)
- split函数 python
- QQ登录时错误码说明及解决办法
- 写在开博第一篇
- oraclez之基础增删查改
- (十)哈希表
- PHP 调用接口生成天气预报 三级联动城市列表 仿中国天气网界面
- windows中添加菜单的几种方法