静态代理:代理类和服务对象实现了同样的接口,限制了代理类只服务于一种类型的对象
动态代理:代理类用Object接收,并应用反射机制,可以代理多种类型对象
静态代理:
(1)接口
public interface Network {
public void browse();
}
(2)接口实现类
public class Realnet implements Network {
@Override
public void browse() {
System.out.println("上网");
}
}
(3)代理类(和被代理类实现同样的接口)
public class Proxynet implements Network {
private Network network;
public Proxynet(Network network) {
this.network = network;
}
@Override
public void browse() {
System.out.println("proxy");
network.browse();
}
}
(4)测试main方法
public class TestNet {
public static void main(String[] args) {
Network network = new Proxynet(new Realnet());
network.browse();
}
}
(5)输出结果
proxy
上网
动态代理:
(1)接口:
public interface Subject {
public String say(String name, Integer age);
}
(2)实现接口的类
public class SubjectImpl implements Subject {
@Override
public String say(String name, Integer age) {
return "name:" + name + ",age:" + age;
}
}
(3)动态代理类(应用的反射机制)
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyInvocationHandler implements InvocationHandler {
private Object obj;
public Object bind(Object o) {
/** 获取目标对象 */
this.obj = o;
/** 返回目标对象的代理对象 */
Object proxy = Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this);
return proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/** method 为指定方法,调用invoke时,需要传入对象实例,此处传入我需要进行代理的对象实例 */
Object temp = method.invoke(this.obj, args);
return temp;
}
}
(4)测试main方法
public class TestSub {
public static void main(String[] args) {
MyInvocationHandler handler = new MyInvocationHandler();
Subject subject = (Subject) handler.bind(new SubjectImpl());
String info = subject.say("hello",30);
System.out.println(info);
}
}
(5)输出结果:
name:hello,age:30