将上一篇写的动态代理进行总结回顾
写一个通用的动态代理类,来加深理解
将上一小节写的动态代理的方法,写成一个工具类,可以更容易理解:
这是个通用的接口,定义被代理的接口是一个Object
package agent1;
import Proxy1.Rent1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//自动生成代理类
public class ProxyInvocationHandle implements InvocationHandler {
//被代理的接口
public Object target;
public void setTarget(Object target) {
this.target = target;
}
//得到代理对象
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
//处理代理实例并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//动态代理本质,就是使用反射机制
Object result = method.invoke(target, args);
return result;
}
}
然后写一个client进行调用:
package agent1;
public class Client3 {
public static void main(String[] args) {
//真实角色
UerServiceImpl uerService = new UerServiceImpl();
//代理角色,不存在
ProxyInvocationHandle proxyInvocationHandle = new ProxyInvocationHandle();
//设置要代理的对象
proxyInvocationHandle.setTarget(uerService);
//动态生成类
UserService proxy = (UserService)proxyInvocationHandle.getProxy();
proxy.add();
proxy.delete();
}
}
其中还用到之前写的几个函数:
增删改查的接口
package agent1;
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
实际的实现类:
package agent1;
//实现对象
public class UerServiceImpl implements UserService {
@Override
public void add() {
System.out.println("增加了一个用户");
}
@Override
public void delete() {
System.out.println("删除了一个用户");
}
@Override
public void update() {
System.out.println("更新了一个用户");
}
@Override
public void query() {
System.out.println("查询了一个用户");
}
}
如果想增加打印日志的功能,可以增加一个log的方法:
package agent1;
import Proxy1.Rent1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//自动生成代理类
public class ProxyInvocationHandle implements InvocationHandler {
//被代理的接口
public Object target;
public void setTarget(Object target) {
this.target = target;
}
//得到代理对象
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
//处理代理实例并返回结果
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
//动态代理本质,就是使用反射机制
Object result = method.invoke(target, args);
return result;
}
//增加打印日志的功能
public void log(String msg) {
System.out.println("执行了" + msg + "方法");
}
}
这么一个工具类就完成了
动态代理的好处:
可以有静态代理的所有优势,一个动态代理类代理的是一个接口,对应的是一类业务
一个动态代理类可以代理多个类,只要实现了同一个的接口
好了,今天就到这里