动静代理速查速记:
动静代理代理:原本应该本人做的事件,却请了他人来做,被请的人就是代理对象。举例:秋季回家买票让人代买动静代理:在程序运行过程中产生的这个对象而程序运行过程中产生对象其实就是咱们方才反射解说的内容,所以,动静代理其实就是通过反射来生成一个代理
在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过应用这个类和接口就能够生成动静代理对象。JDK提供的代理只能针对接口做代理。咱们有更弱小的代理cglibProxy类中的办法创立动静代理类对象public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)最终会调用InvocationHandler的办法InvocationHandlerObject invoke(Object proxy,Method method,Object[] args)
Proxy类中创立动静代理对象的办法的三个参数;ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载Interface对象的数组,示意的是我将要给我须要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就声称实现了该接口(多态),这样我就能调用这组接口中的办法了InvocationHandler对象,示意的是当我这个动静代理对象在调用办法的时候,会关联到哪一个InvocationHandler对象上每一个动静代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当咱们通过代理对象调用一个办法的时候,这个办法的调用就会被转发为由InvocationHandler这个接口的invoke 办法来进行调用。InvocationHandler接口中invoke办法的三个参数:proxy:代表动静代理对象method:代表正在执行的办法args:代表调用指标办法时传入的实参Proxy.newProxyInstance创立的代理对象是在jvm运行时动静生成的一个对象,它并不是咱们的InvocationHandler类型,也不是咱们定义的那组接口的类型,而是在运行是动静生成的一个对象,并且命名形式都是这样的模式,以$结尾,proxy为中,最初一个数字示意对象的标号。System.out.println(u.getClass().getName());
动静代理:
package cn.itcast_06;/* * 用户操作接口 */public interface UserDao { public abstract void add(); public abstract void delete(); public abstract void update(); public abstract void find();}
package cn.itcast_06;public class UserDaoImpl implements UserDao { @Override public void add() { System.out.println("增加性能"); } @Override public void delete() { System.out.println("删除性能"); } @Override public void update() { System.out.println("批改性能"); } @Override public void find() { System.out.println("查找性能"); }}
package cn.itcast_06;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler { private Object target; // 指标对象 public MyInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("权限校验"); Object result = method.invoke(target, args); System.out.println("日志记录"); return result; // 返回的是代理对象 }}
package cn.itcast_06;import java.lang.reflect.Proxy;public class Test { public static void main(String[] args) { UserDao ud = new UserDaoImpl(); ud.add(); ud.delete(); ud.update(); ud.find(); System.out.println("-----------"); // 咱们要创立一个动静代理对象 // Proxy类中有一个办法能够创立动静代理对象 // public static Object newProxyInstance(ClassLoader loader,Class<?>[] // interfaces,InvocationHandler h) // 我筹备对ud对象做一个代理对象 MyInvocationHandler handler = new MyInvocationHandler(ud); UserDao proxy = (UserDao) Proxy.newProxyInstance(ud.getClass() .getClassLoader(), ud.getClass().getInterfaces(), handler); proxy.add(); proxy.delete(); proxy.update(); proxy.find(); }}