动态代理
什么是代理?
拦截真实业务对象访问,通过返回代理对象去操作!
什么是动态?
在运行时去动态处理真实业务对象的访问
代理对象的职责
1.与真实业务对象具备一样的行为!
比较:卖手机,手机厂商生产手机,它可以自己卖,也可以找一个代理人去帮自己卖!
不论是手机厂商还是代理商都有一样的行为:卖手机
2.代理对象本身没有真实业务对象的行为,只是间接的去访问真实对象的行为(方法)
动态代理是面向接口的,不是面向类的!
注意:
1.代理对象执行方法会调用Invocation invoke方法
2.代理对象执行方法 需要准备 三个参数
3.当代理对象调用final修改的方法时不会调用invoke方法
动态代理实例
1.真实业务
2.真实业务实现public interface HelloService { String sayHello(String name); }
public class HelloServiceImpl implements HelloService { @Override public String sayHello(String name) { System.out.println("hello "+name); return "helloworld"; } }
3.代理工厂类
4.使用代理类调用方法public class HelloProxy { //根据真实helloService对象获得一个代理对象 public static HelloService getProxy(final HelloService helloService) { //返回一个真实对象的代理对象 /** * ClassLoader loader, 真实对象的类加载器 Class<?>[] interfaces, 真实对象的接口 InvocationHandler h 代理响应器 */ //如何获取类加载器 ClassLoader classLoader = helloService.getClass().getClassLoader(); //如何获取真实对象的接口 Class<?>[] interfaces = helloService.getClass().getInterfaces(); Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new InvocationHandler() { /** * 匿名内部类 * 对于真实业务对象访问,都将执行以下invoke方法 * @param proxy 代理对象 * @param method 执行的真实业务对象的方法 * @param args 执行的真实业务对象方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("执行了invoke..."); System.out.println("执行了"+method.getName()); Object res = method.invoke(helloService, args); return res; } }); return (HelloService) proxy; } }
运行结果public class HelloServiceDemo { public static void main(String[] args) { //真实业务对象 HelloService helloService = new HelloServiceImpl(); //通过代理程序获取真实业务的代理对象 HelloService helloProxy = HelloProxy.getProxy(helloService); //用代理对象访问方法 String result = helloProxy.sayHello("jack"); System.out.println(result); } }
主要关注动态代理类的创建方式!!!