JDK动态代理
一个对象代替另一个对象,去完成其原本的功能
被代替的对象 叫做被代理对象
代替别的对象的 对象叫做代理对象
代理对象可以在被代理对象的功能基础之上进行功能的扩充
当我们对一个类的方法 功能并不满意 又不能修改这个类的代码 可以采用代理模式增强这个类的方法
增强功能对原有代码没有影响 切换灵活 耦合度低
接口类
public interface Court {
int docourt(int a);
}
实体类
public class Person implements Court{
private String name;
public Person(){
}
public Person(String name) {
this.name = name;
}
@Override
public int docourt(int a) {
System.out.println(name+"说:我没杀人!");
return 0;
}
}
测试类
public class Test {
public static void main(String[] args) {
//创建被代理对象
Court court = new Person("张三");
//第一个参数:类加载器
ClassLoader classLoader = court.getClass().getClassLoader();
//第二个参数:被代理对象实现的接口字节码数组
Class [] interfaces = court.getClass().getInterfaces();
//第三个参数:执行处理器
InvocationHandler invocationHandler = new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object res = null;
//当代理对象调用了任何一个方法,都会进入这个方法
if (method.getName().equals("docourt")){
System.out.println(111111);
System.out.println(111111);
System.out.println(111111);
System.out.println(111111);
res = method.invoke(court,args);
}else {
res = method.invoke(court, args);
}
return res;
}
};
//创建代理对象
//第一个参数:类加载器
//第二个参数:被代理对象实现的接口字节码数组
//第三个参数:执行处理器,用来定义方法的增强规则
Court courtProxy = (Court) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
courtProxy.docourt(10);
}
}
代理之前的结果
加了动态代理后的结果
特点:
是面向接口的动态代理,实现类中自行定义的方法,Proxy动态代理不负责增强
缺点:
- 必须有接口才可以使用
- 只能增强接口中定义的方法
- 只能读取接口方法上的注解 实现类方法上的注解读取不了