首先需要了解两个类 java.lang.reflect.Proxy和java.lang.reflect.InvocationHandler
我们需要一个接口UserService和一个被代理的实现类UserServiceImpl
public interface UserService {
public void add();
public void delete();
public void update();
public void query();
}
public class UserServiceImpl implements UserService {
public void add() {
System.out.println("增加了一个用户");
}
public void delete() {
System.out.println("删除了一个用户");
}
public void update() {
System.out.println("修改了一个用户");
}
public void query() {
System.out.println("查询了一个用户");
}
}
编写ProxyInvocationHandler类来实现InvocationHandler接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
private Object target;//被代理的对象
public void setTarget(Object target) {
this.target = target;
}
//获取代理对象
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
//接口中invoke方法的重写,代理类执行的其他方法也写在invoke方法中
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+"方法");
}
}
编写Client类执行获取代理及代理执行方法
public class Client {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();//被代理对象
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setTarget(userService);//将被代理对象传入
UserService proxy = (UserService) pih.getProxy();//得到proxy代理类对象
proxy.add();//执行接口中定义的方法
proxy.delete();
proxy.update();
proxy.query();
}
}
动态代理的好处:(转自狂神说)
1.可以使真实角色的操作更加纯粹,不用去关注一些公共的业务!
2.公共业务交给代理角色完成,实现了业务的分工!
3.公共业务发生扩展的时候,方便集中管理!
4.一个动态代理类代理的是一个接口,一般对应一类业务!
5.一个动态代理类可以代理多个类,只要该类实现的是同一接口!