java静态代理和动态代理区别和实现

╰半夏微凉° 2023-01-17 02:23 236阅读 0赞

静态代理:代理类和服务对象实现了同样的接口,限制了代理类只服务于一种类型的对象

动态代理:代理类用Object接收,并应用反射机制,可以代理多种类型对象

静态代理:

(1)接口

  1. public interface Network {
  2. public void browse();
  3. }

(2)接口实现类

  1. public class Realnet implements Network {
  2. @Override
  3. public void browse() {
  4. System.out.println("上网");
  5. }
  6. }

(3)代理类(和被代理类实现同样的接口)

  1. public class Proxynet implements Network {
  2. private Network network;
  3. public Proxynet(Network network) {
  4. this.network = network;
  5. }
  6. @Override
  7. public void browse() {
  8. System.out.println("proxy");
  9. network.browse();
  10. }
  11. }

(4)测试main方法

  1. public class TestNet {
  2. public static void main(String[] args) {
  3. Network network = new Proxynet(new Realnet());
  4. network.browse();
  5. }
  6. }

(5)输出结果

  1. proxy
  2. 上网

动态代理:

(1)接口:

  1. public interface Subject {
  2. public String say(String name, Integer age);
  3. }

(2)实现接口的类

  1. public class SubjectImpl implements Subject {
  2. @Override
  3. public String say(String name, Integer age) {
  4. return "name:" + name + ",age:" + age;
  5. }
  6. }

(3)动态代理类(应用的反射机制)

  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. public class MyInvocationHandler implements InvocationHandler {
  5. private Object obj;
  6. public Object bind(Object o) {
  7. /** 获取目标对象 */
  8. this.obj = o;
  9. /** 返回目标对象的代理对象 */
  10. Object proxy = Proxy.newProxyInstance(o.getClass().getClassLoader(), o.getClass().getInterfaces(), this);
  11. return proxy;
  12. }
  13. @Override
  14. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  15. /** method 为指定方法,调用invoke时,需要传入对象实例,此处传入我需要进行代理的对象实例 */
  16. Object temp = method.invoke(this.obj, args);
  17. return temp;
  18. }
  19. }

(4)测试main方法

  1. public class TestSub {
  2. public static void main(String[] args) {
  3. MyInvocationHandler handler = new MyInvocationHandler();
  4. Subject subject = (Subject) handler.bind(new SubjectImpl());
  5. String info = subject.say("hello",30);
  6. System.out.println(info);
  7. }
  8. }

(5)输出结果:

  1. name:hello,age:30

发表评论

表情:
评论列表 (有 0 条评论,236人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态代理静态代理区别

     一、概念     代理模式是常用的Java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事

    相关 Java-静态代理动态代理

    大家比较熟悉了Java中的代理模式。而代理模式可以分为静态代理和动态代理,下面我们通过Demo来具体分析下静态代理和动态代理。 我们先实现一个计算器接口类和实现类,具体代码