上一篇博客大致说了一下静态代理相关的一些知识点和用法。我们不难看出静态代理的优缺点。
静态代理的优点:业务类只需要关注业务本身,保证了代码的重用性。
静态代理的缺点:一个真实角色只能对应一个代理角色,要是真实角色多了,代理也随着增多,会导致类的急剧膨胀。
好吧,既然你已经发现她的缺点了,你还能包容她吗?
因此也就有了这篇博客。
先上一个接口
public interface Subject {
public String say(String name,int age);
public void say();
}
真正实现类实现具体接口
public class RealSubject implements Subject {
@Override
public String say(String name, int age) {
System.out.println("打印输出...");
return "姓名:"+ name +",年龄:" + age;
}
@Override
public void say() {
System.out.println("我执行了....");
}
}
动态代理测试类方法 不再具体指定是哪个实现类的代理,而是invoke()方法中的第三个形参,根据传入的不同的值利用反射技术动态实现代理功能。
public class DynaProxyDemo {
@Test
public void test(){
//获得动态的代理对象----在运行时 在内存中动态的为RealSubject创建一个虚拟的代理对象
//objProxy是代理对象 根据参数确定到底是谁的代理对象
Subject objProxy = (Subject) Proxy.newProxyInstance(
//与目标对象相同的类加载器
RealSubject.class.getClassLoader(),
//获得全部的接口
new Class[]{Subject.class},
//得到InvocationHandler接口的子类实现
new InvocationHandler() {
@Override
//invoke 执行代理对象的方法
//method 代表目标对象的字节码对象
//args 代表目标对象的相应的方法的参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//反射
Object temp = method.invoke(new RealSubject(),args);
//System.out.println(temp);
return temp;
}
}
);
String temp =objProxy.say("张三丰",30);
System.out.println(temp);
//objProxy.say();
}
}
测试结果