JDK动态代理模式
解决问题: 主要业务与次要业务松耦合的组装
本质: 监控行为特征
下面主要解决: 吃饭前洗手,wc后洗手
- 人的行为接口
public interface Behavior {
//吃饭
void eat();
//上厕所
void wc();
}
- 人实现了该有的行为
public class Person implements Behavior {
@Override
public void eat() {
System.out.println("吃饭");
}
@Override
public void wc() {
System.out.println("上WC");
}
3.代理类 实现Java动态代理类位于java.lang.reflect包下的代理处理接口
public class Invocation implements InvocationHandler {
private Object target;
public Invocation(Object target){
this.target=target;
}
/**
*
* @param proxy 代理类
* @param method 要被代理的多有方法
* @param args 存放实际参数的集合
* @return 返回需要的参数
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//获取方法名
String name = method.getName();
//吃饭先洗手
if(name.equals("eat")){
wash();
method.invoke(this.target,args);
//wc完后洗手
}else {
method.invoke(this.target,args);
wash();
}
return null;
}
/**
* 洗手的方法
*/
private void wash(){
System.out.println("洗手中---------");
}
}
4.测试
public class RunMain {
public static void main(String[] args) {
//人
Person person = new Person();
//代理的多态形式
InvocationHandler invocation = new Invocation(person);
Class<?> cls = person.getClass();
/**
* loader 类加载器
* interfaces 实现接口
* invocation InvocationHandler接口
*/
Behavior behavior = (Behavior) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), invocation);
behavior.eat();
behavior.wc();
}
}