`

java的反射机制之静态代理和动态代理的对比

 
阅读更多

一、静态代理

//接口
interface All{  
    public void method1();  
} 
 //被代理類
class A implements All{  
//重寫接口中的方法
    public void method1(){  
        System.out.println("method");  
    }  
} 
//代理類
class B implements All{  
	All obj;//被代理類的聲明,也是代理類B的成員變量
public B(All obj){//構造器
	this.obj = obj;
}

//重寫接口中的方法
    public void method1(){  
        System.out.println("method");  
        obj.method1();//調用被代理類中的方法
    } 
     
} 

public class TestRflection{  
    public static void main(String args[]){  
    //1、創建一個被代理類的對象
    A a = new A();
    //2、創建代理類的對象
    B b = new B(a);
    //3、調用的是代理類的方法,但實際上調用的被代理類的方法
    b.method1();
    
}

 二、动态代理

  
//接口  
interface All{  
    public void method1();  
}  
//被代理類
class A implements All{  
//重寫接口中的方法
    public void method1(){  
        System.out.println("method");  
    }  
}  
//通過實現InvocationHandler接口的類,創建代理類的對象並且實現對被代理類中方法的調用
class B implements InvocationHandler{  
   Object obj;//被代理類對象的聲明
   public Object setObject(Object obj){
   this.obj = obj;	//實例化被代理類
   //通過Proxy類的靜態方法newProxyInstance動態的創建被代理類的對象,并返回
   return Proxy.newProxyInstance(obj.getClass().getClassLoder(),obj.getClass().getInterfaces(),this);
   }
   @Override // 重寫InvocationHandler接口中的抽象方法,相當于是轉換成了對被代理類對象中方法的調用
   public Object invoke(Object proxy,Method method,Object[] args)  throws Throwable{
   	Object returnVal = method.invoke(obj,args);
   	return returnVal;//返回的是被代理類中被調用的方法的返回值,若返回的是null,則說明調用的是void類型
   }
}  
public class TestRflection{  
    public static void main(String args[]){  
    //1、創建一個被代理類的對象
    A a = new A();
    //2、創建一個實現了InvocationHandler接口的類的對象
    B b = new B();
    //3、調用setObject()方法,動態的創建一個Object類型的代理類的對象
    Object c = b.setObject(a);
    //4、在創建代理類的那個方法也實現了All接口
    (All)d = All(c);
    //5、此時就可以掉用被代理類的方法了
    d.method1();
    
}

 总结:

静态代理,其实就是静态的创建某一个代理类,只适合代理这一个被代理的类,如果想要代理其他的类,就必须再显示的写一个其他类的代理类;

而动态代理,其实就是动态的创建一个代理类,可代理多个被代理的类,能够创建任何一个被代理类的代理类。这样就减少了代码量,提高了开发效率

 

PS:AOP(面向切面的编程),会用到动态代理,即在invoke()方法的前面和后面可能是其他类的方法,invoke本身就是一个动态的方法,它会应调用的对象的不同,而实现不同的方法。

分享到:
评论

相关推荐

    AOP动态代理(反射机制)

    5. **对比静态代理**:动态代理相比静态代理(手动编写代理类)具有更高的灵活性。静态代理需要为每个目标类创建一个代理类,而动态代理则可以在运行时动态创建代理对象,减少了代码量,同时适应性更强,能够处理...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    Java反射机制概述.pdf

    同时,对Java反射机制的讨论揭示了其在运行时动态获取和操作类成员的强大能力,以及在框架开发、对象序列化等场景下的应用价值。不过,反射机制的使用也伴随着性能开销和安全风险,需要谨慎考虑。

    Jdk动态代理和cglib动态代理原理

    JDK动态代理是Java内置的一种机制,依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。以下是JDK动态代理的基本工作原理: 1. **InvocationHandler接口**:这是处理代理对象方法调用...

    aop思想的java代码实现

    通过对比静态代理和动态代理的实现,我们可以更好地理解这两种方式的优缺点和适用场景。静态代理易于理解,但灵活性较差;动态代理则更适用于需要动态绑定和多代理的情况,但可能需要对反射和`InvocationHandler`有...

    java面试题超详细

    - **代理模式**:静态代理和动态代理的实现。 9. **网络编程** - **Socket通信**:客户端和服务器端的实现。 - **HTTP协议**:了解GET和POST请求的区别。 - **HTTPS**:与HTTP的区别,安全性的增强。 10. **...

    2018JAVA经典就业面试大纲

    2. 动态代理:理解JDK动态代理和CGLIB动态代理的原理,以及在AOP(面向切面编程)中的应用。 六、Java虚拟机(JVM) 1. JVM内存模型:理解堆、栈、方法区、本地方法栈的结构和作用。 2. 垃圾回收:了解GC(垃圾...

    jdk 动态代理

    动态代理与静态代理的对比 静态代理是在编译时创建的,需要为每个目标类创建一个代理类,而动态代理则在运行时生成,避免了大量代理类的创建,更加灵活。 ### 6. 限制与注意事项 - 动态代理只能代理实现了接口的...

    北京圣思园科技有限公司JAVA面授培训大纲

    - **动态代理与反射机制**:了解动态代理的原理及反射机制在运行时获取类信息的方法。 #### 五、深入理解JVM - **Java代码执行机制**:理解Java程序的执行流程,从源代码到字节码再到机器码的过程。 - **源代码编译...

    反射与New的区别

    Java中的反射机制与`new`关键字是两种不同的对象创建方式,它们各有特点,适用于不同的场景。反射机制允许我们在运行时动态地获取类的信息并创建或访问对象,而`new`关键字则是编译时期就已经确定的对象创建方式。 ...

    java软件工程师面试试题集合

    - 动态代理:了解Java动态代理的实现,包括JDK动态代理和CGLIB动态代理。 7. **网络编程** - Socket编程:创建TCP和UDP套接字,进行数据的发送和接收。 - HTTP协议:理解HTTP请求和响应的结构,以及状态码的含义...

    疯狂JAVA讲义

    1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 学生提问:不是说JVM是运行Java程序的虚拟机吗?那JRE和JVM的关系是怎样的呢? 8 学生提问:为什么不安装公共JRE系统呢? 9 1.4.2 设置...

    Think in java 3rd Edition chinese

    7. **反射与动态代理**:深入探讨了Java反射机制,如何在运行时获取类信息、创建对象、调用方法,以及动态代理的应用,这些都是Java强大的元编程能力的体现。 8. **枚举与注解**:介绍了Java的枚举类型,以及注解的...

    面试题 java方向 新版

    5. **反射机制** - 类加载:理解类加载的过程,双亲委派模型。 - 运行时动态类型:通过Class类获取类信息,创建对象,调用方法。 - 动态代理:了解Proxy类和InvocationHandler接口。 6. **设计模式** - 单例...

    java面试题集

    3. AOP代理:了解动态代理和静态代理,理解切面编程思想。 通过深入学习以上知识点,你将能更好地应对Java面试,提高自己的技术实力。同时,不断关注技术发展,结合实际项目经验,将理论知识转化为实际能力,将使你...

    Java面试题

    - 动态代理:Java的InvocationHandler接口和Proxy类,以及它们在AOP(面向切面编程)中的应用。 6. **IO流**: - 流的分类:字节流和字符流,以及输入流和输出流的概念。 - NIO(New IO):缓冲区、选择器和通道...

    springAOP代理讲解

    JDK动态代理是基于Java反射机制实现的。它的核心是`java.lang.reflect.Proxy`类和`InvocationHandler`接口。通过调用`Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`方法...

    华为等各大厂Java面试笔试题汇总.rar

    - 反射:理解反射机制,能动态调用类的方法、获取属性和构造器。 - 注解:了解注解的定义、元注解和使用注解实现动态配置。 9. **多线程** - 线程创建:掌握通过Thread类和Runnable接口创建线程的方法。 - 线程...

    Java面试笔试宝典

    - **代理模式**:静态代理和动态代理的区别,JDK动态代理的实现。 7. **JVM** - **内存模型**:堆、栈、方法区、程序计数器、本地方法栈的理解。 - **垃圾回收**:GC的工作原理,新生代、老年代、内存分代的概念...

Global site tag (gtag.js) - Google Analytics