JDK原生动态代理
动态代理是指动态的在内存中构建代理对象
话不多说,直接上代码~
public interface DataService {
public void connection();
}
public class DataServiceImpl implements DataService{
@Override
public void connection() {
System.out.println("02:数据库建立连接~");
}
}
public class DynamicProxy implements InvocationHandler {
private Object object;
public Object newInstanceDynamic(Object object){
this.object=object;
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("操作前进行入参的打印");
method.invoke(object,args);
System.out.println("操作后进行参数的加密处理");
return null;
}
}
class toImpl{
public static void main(String[] args) {
DataServiceImpl dataService=new DataServiceImpl();
DataService dynamic=(DataService)new DynamicProxy().newInstanceDynamic(dataService);
System.out.println(dynamic.getClass().getName());
dynamic.connection();
}
}
动态代理小讲堂
- 一:动态代理类需要实现InvocationHandler接口
- 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
- invoke方法接收到的三个参数分别代表什么意思呢?
- Object invoke(Object proxy, Method method, Object[] args) throws Throwable
传入参数 | 参数的含义 |
---|
proxy | 传入的是被代理的那个目标的对象 |
method | 被代理目标对象的某个方法 |
args | 目标对象某个方法的传入的参数列表 |
- 二:需要用到Proxy类,这个类主要是用来动态创建一个代理对象的类,一般使用newProxyInstance 这个方法
- public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws IllegalArgumentException
传入参数 | 参数的含义 |
---|
loader | 表示由哪个ClassLoader 类加载器来生加载动态代理类 |
interfaces | 被代理对象的接口数组,动态代理类实现了被代理对象的接口,那么就可以调用这组接口中的方法了 |
handler | 象表示的是在调用动态代理类的时候,被关联到哪个InvocationHandler对象上,用来定位到某个动态代理类上 |
动态代理类的总结
- 不需要编写大量的动态代理类,不需要维护目标对象和相应的接口
- 被代理类一定需要实现接口,所以是在接口的基础上实现的动态代理