Java 动态代理

作者: SimpleFunc | 来源:发表于2019-06-30 14:45 被阅读0次

2015-03-30 10:00

代理模式

代理模式是一种常见的设计模式,为其他对象提供一种代理以控制对这个对象的访问。代理类与委托类有同样的接口,代理类负责为委托类预处理,过滤和转发消息,并进行消息被委托类执行之后的逻辑处理

静态代理

开发人员实现代码或使用特定工具生成代码之后编译,在程序运行之前,代理类的class文件以及存在

例:

//接口
public interface Subject {
   public void foo();
}

实际对象

public class RealSubject implements Subject {
    public void foo(){
       System.out.println("RealSubject foo");  
    }     
}

静态代理类

public class SubjectProxy implements Subject {
    Subject subjectImpl = new RealSubject();
    public void foo(){
       subjectImpl.foo();
    }     
}

main:

public static void main(String args[]){
    Subject sub = new SubjectProxy();
    sub.foo();
}

当接口的方法很多时,代理类的代码量将相当大,不便于维护

动态代理

要实现动态代理必须实现InvocationHandler接口,InvocationHandler 只有一个方法:

invoke(Object proxy, Method method, Object[] args);

该方法用来处理被代理实例调用的方法的处理

每个Proxy实例都有一个关联的invocation handler。当代理调用一个方法的时候,该方法被编码发送到InvocationHandler的invoke方法。

public class ProxyHandler implements InvocationHandler{

   //代理委托对象
   private Object tar;

   public ProxyHandler(Object tar){
       this.tar = tar;
   }

   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  {  
        //调用具体委托对象的方法
        Object returnValue = method.invoke(tar, args);    
        return returnValue;  
    }  
}

使用:

public static void main(String[] args)  {  

   Subject realSubject = new RealSubject();  
   InvocationHandler handler = new ProxyHandler(realSubject);  

    ClassLoader loader = realSubject.getClass().getClassLoader();  
    Class[] interfaces = realSubject.getClass().getInterfaces();  
    /**
     * 创建一个代理类的实例,该代理类将指定接口的方法发送到对应的              
     * InvocationHandler
     */
    Subject subject = (Subject) Proxy.newProxyInstance(loader, interfaces, handler);  
    subject.foo();    
 }  

在运行时,JDK会生成一个代理类的实例,该代理类继承Proxy类,并实现了
Subject接口。在实现Subject接口方法是的时候,通过JAVA反射机制调用了InvocationHandler的invoke方法。

相关文章

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

  • java动态代理(JDK和cglib)(转载自http://ww

    java动态代理(JDK和cglib) JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是...

  • java基础巩固笔记(4)-代理

    标签: java Contents java基础巩固笔记(4)-代理概念动态代理创建动态类动态代理的工作原理面向切...

  • java 动态代理

    动态代理动态代理可以让我们在运行时动态生成代理类,解耦程度更高。Java 动态代理的实现主要借助于 java.la...

  • java随笔(十一)

    java动态代理源码分析,总结。java动态代理实现步骤: 通过阅读源码发现,动态生成代理对象$Proxy0,该对...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

网友评论

    本文标题:Java 动态代理

    本文链接:https://www.haomeiwen.com/subject/inkbcctx.html