观察以下代码:
interface Subject{ //定义接口
public String say(String name,int age);
}
class RealSubject implements Subject{ //接口实现类
@Override
public String say(String name, int age) {
return "姓名:" + name + " ,年龄: " + age;
}
}
class ProxySubject implements Subject{ //代理类
private Subject sub = null;
public ProxySubject(Subject sub){
this.sub = sub;
}
@Override
public String say(String name, int age) {
return this.sub.say(name,age); //代理类调用实现类的方法
}
}
public class DynaDemo01 {
public static void main(String[] args) {
Subject subject = new ProxySubject(new RealSubject());
String info = subject.say("张三", 20);
System.out.println(info);
}
}
程序运行结果:
以上代理为静态代理,因为一个代理类只能为一个接口服务,那么如果现在有多个接口的话,就会产生过多的代理类,此时可以使用动态代理。
在Java中要实现动态代理机制,需要以下几个接口 、类的支持:
java.lang.reflect.InvocationHandler;
java.lang.reflect.Method;
java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Subject{ //定义接口
public String say(String name, int age);
}
class RealSubject implements Subject{ //接口实现类
@Override
public String say(String name, int age) {
return "姓名:" + name + " ,年龄: " + age;
}
}
class MyInvocationHandle implements InvocationHandler{ //代理类,根据传入的实例动态调用方法
private Object obj;
public Object bind(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object invoke = method.invoke(this.obj, args);
return invoke;
}
}
public class DynaDemo02 {
public static void main(String[] args) {
Subject subject = (Subject) new MyInvocationHandle().bind(new RealSubject());
String info = subject.say("李四", 22);
System.out.println(info);
}
}
程序运行结果:
此动态代理机制在开发中使用较少,在框架(如Spring)的底层代码中较常用。