动静代理速查速记:
动静代理
代理:原本应该本人做的事件,却请了他人来做,被请的人就是代理对象。举例:秋季回家买票让人代买
动静代理:在程序运行过程中产生的这个对象
而程序运行过程中产生对象其实就是咱们方才反射解说的内容,所以,动静代理其实就是通过反射来生成一个代理
在 Java 中 java.lang.reflect 包下提供了一个 Proxy 类和一个 InvocationHandler 接口,通过应用这个类和接口就能够生成动静代理对象。JDK 提供的代理只能针对接口做代理。咱们有更弱小的代理 cglib
Proxy 类中的办法创立动静代理类对象
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
最终会调用 InvocationHandler 的办法
InvocationHandler
Object 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();}
}