美文网首页
java动态代理

java动态代理

作者: 过去今天和未来 | 来源:发表于2017-12-03 14:57 被阅读12次

三种代理方式

静态代理模式

1.客户端

public class Client {   

     public static void main(String[] args){     

         Subject subject = new Proxy(new RealSubject());     

         subject.request();    }}

2.代理接口

public interface Subject {   

      public void request();

}

3.代理类

public class Proxy implements Subject{        //引入目标对象

      private RealSubject realSubject; 

      public Proxy(RealSubject realSubject) {       

           this.realSubject = realSubject;

      }

      public void request(){   

          System.out.println("开始....");   

          realSubject.request();   

          System.out.println("结束。。。。");

      }}

4.目标类

public class RealSubject implements Subject{   

      public void request(){         

      System.out.println("目标对象。。。。");

 }}

动态代理模式 基于JDK代理  InvocationHandler代理接口

1.客户端

public class Client {     

       public static void main(String[] args){ //动态代理对象进行调用 

       Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]                                         {Subject.class},new JdkProxySubject(new RealSubject()));

      }

}

2.代理类

public class JdkProxySubject implements InvocationHandler{

          private RealSubject realSubject;  //目标对象

          public JdkProxySubject(RealSubject realSubject) { 

          this.realSubject = realSubject;

          }

         @Override

          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                                    System.out.println("before");

              Object result = null; 

              try{

                   result = method.invoke(realSubject,args);  //调用目标对象的方法

             }catch (Exception e){ 

                  System.out.println("ex:"+e.getMessage()); 

                  throw e; 

             }finally {

               System.out.println("after"); 

           }

              return result;}}

源码解读

客户端调用

public static void main(String[] args){

       System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");

        //动态代理对象进行调用

       Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]                        {Subject.class},  new JdkProxySubject(new RealSubject()));

//  subject.hello();

}

在proxy类中

//该方法中主要从缓存中拿类,如果存在直接从缓存中取,否则创建并放入缓存中

     Class cl = getProxyClass0(loader, intfs); 

//主要ProxyClassFactory 类中生成

      proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory());

      interfaceClass = Class.forName(intf.getName(), false, loader); //读取接口信息

       byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

        proxyName, interfaces, accessFlags); //通过生成器生成字节码文件

相关文章

  • 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/rmbabxtx.html