前言:
根据静态代理来实现Java中的动态代理模式。
一、什么是代理模式和静态代理
前往上一篇博客的传送门:博客地址
二、静态代理和动态代理的区别
在静态代理中代理对象需要我们自己手动创建,在动态代理中将自动创建代理对象而不需要我们手动创建。
三、根据之前博客中案例,实现Java中的动态代理
将代理者剔除之后的代码为:
1、房东接口
/**
*
* @author 大家都说名字长不会被发现
* 房东接口
*/
public interface Tenant {
String rent(double money);
}
2、具体房东类
/**
*
* @author 大家都说名字长不会被发现
*
* 陈姓房东类
*/
public class TenantByChen implements Tenant{
public String rent(double money) {
//房东获得扣除中介费后的房租
System.out.println("出租房屋,"+"获得房租:"+money+"¥");
//将钥匙给中介
return "钥匙";
}
}
3、租客类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
*
* @author 大家都说名字长不会被发现
* 租客类
*/
public class Landlord {
public static void main(String[] args){
Landlord landlord = new Landlord();
landlord.renting();
}
public void renting(){
//找中介公司租房
final Tenant chen = new TenantByChen();
/**
* req.getClass().getClassLoader() 与目标对象相同的类加载器
* req.getClass().getInterfaces() 与目标对象相同的字节码对象数组
* new InvocationHandler() 回掉接口
*/
Tenant tenant = (Tenant) Proxy.newProxyInstance(
chen.getClass().getClassLoader(),
chen.getClass().getInterfaces(),
new InvocationHandler() {
/**
* Object proxy 代理对象
* Method method 调用方法
* Object[] args 传递参数
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
for (Object object : args) {
double money = (Double) object;
//扣除中间费
money = money - 800.00;
System.out.println("中介获得,"+800.00+"¥中介费");
String key = (String) method.invoke(chen, money);
//替换门锁
key = "换锁后的新"+key;
return key;
}
return null;
}
});
//调用中介出租房屋功能
String key = tenant.rent(2500.00);
System.out.println("租客获得"+key);
}
}
可以看到代码的变化是,剔除了原本的代理者类。使用Java提供API(Proxy.newProxyInstance)来动态获取代理者对象,其他类均保持不变。这样的好处是去除了代理者中和被代理者同样的方法。