房屋租房的动态代理实现
由于静态代理的弊端,代理类和被代理类成对出现,为对其优化产生了被代理类
Rent为租房接口
Host为房东
ProxyInvocationHandler代理类处理程序(负责代理类的生成和处理)
Client(模拟客户)
package demo1;
//动态代理的代理类和真实角色(被代理对象都需要继承指定接口)
//租房
public interface Rent {
void rent();
}
package demo1;
//房东租房
public class Host implements Rent{
public void rent() {
System.out.println("房东租房");
}
}
package demo1;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//代理类处理程序
//InvocationHandler为了执行代理对象
public class ProxyInvocationHandler implements InvocationHandler {
//真实对象(房东)被代理类
Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
public Rent getRentProxy(){
return (Rent) Proxy.newProxyInstance(this.getClass().getClassLoader(),rent.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log();
Object result = method.invoke(rent, args);//执行真实对象的方法
after();
return result;
}
// 创建日志(辅助程序)
public void log(){
System.out.println("看房");
}
// 创建
public void after(){
System.out.println("签合同");
}
}
package demo1;
//客户
public class Client {
public static void main(String[] args) {
// 真实角色(房东)
Host host = new Host();
// 客户要租房要创建代理对象(中介)
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
// 设置代理类的 真实角色
proxyInvocationHandler.setRent(host);
// 创建代理对象
Rent rentProxy = proxyInvocationHandler.getRentProxy();
// 代理对象执行程序
rentProxy.rent();
}
}
当涉及到我们的web开发时 我们需要对xxxServiceImpl程序需要辅助功能和日志时
XxxServiceImpl为真实对象(被代理类)
XxxService接口
夏利为动态代理实现此日志的添加
package demo2;
public interface UserService {
void add();
void delete();
void update();
void query();
}
package demo2;
//真实对象 想要在方法加入日志
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("执行查询方法");
}
}
package demo2;
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 getTarget(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 加入日志
show(method.getName());
method.invoke(target,args);
return null;
}
public void show(String name){
System.out.println("执行"+name+"方法");
}
}
package demo2;
public class Client {
public static void main(String[] args) {
// 真实对象
UserService userService = new UserServiceImpl();
// 生成代理类
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
proxyInvocationHandler.setTarget(userService);
UserService target = (UserService) proxyInvocationHandler.getTarget();
// 执行方法
target.delete();
}
}