实际的应用场景:
动态代理的实现方式有两种:
1.cgLib
2.jdk1.8动态代理
应用场景:
aop 底层是通过动态代理实现,并且应用到了反射的原理,(关于反射以后会用得到的,以后会讲解)
说了这么多,其实作为程序员,最重要的是代码直接上,通过代码直接的去体现这个问题是很直观的,理论结合实践,这样可以做到很深刻的理解和应用;
package com.weigu.xiaochuang.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.Arrays; public class DynamicProxy implements InvocationHandler { //真实对象的引用,被代理的实体,就是为了真实对象的作用 private Object target; //一定是为了初始化对象用的 public DynamicProxy(Object target) { this.target = target; } //实现具体真实对象的方法 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("被代理的真实对象:" + proxy.getClass()); System.out.println("被代理真实对象的方法:" + method.getName()); System.out.println("参数:" + Arrays.toString(args)); System.out.println(System.currentTimeMillis() + " 进入了方法"); // 中间是这个方法 Object result = method.invoke(target, args); if (result != null) { System.out.println("invoke object:" + result.getClass()); } else { System.out.println("invoke is null"); } System.out.println(System.currentTimeMillis() + " 方法执行完毕"); return result; } @SuppressWarnings("unchecked") public <T> T getProxy() { return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this ); } public static void main(String[] args) { Landlord landlord = new LandlordImpl(); DynamicProxy dynamicProxy = new DynamicProxy(landlord); // 这一步是关键 Landlord landlordProxy = (Landlord) Proxy.newProxyInstance( landlord.getClass().getClassLoader(), landlord.getClass().getInterfaces(), dynamicProxy ); landlordProxy.rental(); } }
关于动态代理注意以下两个点:
1.动态代理的实现:代理类实现了invocationHandler接口
2.代理的方法:invoke方法;三个参数的详解
3最重要的一点就是:invoke方法调用的时机,就是当代理类调用的时候就是会调用的,其他的时间是不会调用的,
总而言之.真正的业务逻辑不会变的,只是这个基础之上增加了一些代理类本身想打到的目的