反射(Reflection)是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,可以在运行时访问 Java 对象的属性,方法,构造方法等。
应用场景
开发通用框架 - 反射最重要的用途就是开发各种通用框架。比如 Spring通过 XML 文件配置 JavaBean、Filter 等,为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。动态代理 - 在切面编程(AOP)中,需要拦截特定的方法,通常,会选择动态代理方式。注解 - 注解本身仅仅是起到标记作用,它需要利用反射机制,根据注解标记去调用注解解释器,执行行为。如果没有反射机制,注解并不比注释更有用。可扩展性功能 - 应用程序可以通过使用完全限定名称创建可扩展性对象实例来使用外部的用户定义类。缺点
性能开销 大- 反射操作的性能要比非反射操作的性能要差,应该在性能敏感的应用程序中频繁调用的代码段中避免。破坏封装性 - 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。内部曝光 - 由于反射允许代码执行在非反射代码中非法的操作,例如访问私有字段和方法,所以反射的使用可能会导致意想不到的副作用,这可能会导致代码功能失常并可能破坏可移植性。反射代码打破了抽象,因此可能会随着平台的升级而改变行为。Class 对象
要想使用反射,首先需要获得待操作的类所对应的 Class 对象。
反射的本质:在运行时,把每个Java 类中的各种属性映射成一个个的 Java 对象。
假如定义了以下代码:
User user = new User();
1、JVM 加载方法的时候,遇到new User(),JVM 会根据User的全限定名去加载User.class;
2、JVM 会去本地磁盘查找User.class文件并加载 JVM 内存中。
3、JVM 通过调用类加载器自动创建这个类对应的Class对象,并且存储在 JVM 的方法区。
获得 Class 的三种方法:
(1)使用 Class 类的 forName静态方法
应用场景
开发通用框架 - 反射最重要的用途就是开发各种通用框架。比如 Spring通过 XML 文件配置 JavaBean、Filter 等,为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。动态代理 - 在切面编程(AOP)中,需要拦截特定的方法,通常,会选择动态代理方式。注解 - 注解本身仅仅是起到标记作用,它需要利用反射机制,根据注解标记去调用注解解释器,执行行为。如果没有反射机制,注解并不比注释更有用。可扩展性功能 - 应用程序可以通过使用完全限定名称创建可扩展性对象实例来使用外部的用户定义类。缺点
性能开销 大- 反射操作的性能要比非反射操作的性能要差,应该在性能敏感的应用程序中频繁调用的代码段中避免。破坏封装性 - 反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。内部曝光 - 由于反射允许代码执行在非反射代码中非法的操作,例如访问私有字段和方法,所以反射的使用可能会导致意想不到的副作用,这可能会导致代码功能失常并可能破坏可移植性。反射代码打破了抽象,因此可能会随着平台的升级而改变行为。Class 对象
要想使用反射,首先需要获得待操作的类所对应的 Class 对象。
反射的本质:在运行时,把每个Java 类中的各种属性映射成一个个的 Java 对象。
假如定义了以下代码:
User user = new User();
1、JVM 加载方法的时候,遇到new User(),JVM 会根据User的全限定名去加载User.class;
2、JVM 会去本地磁盘查找User.class文件并加载 JVM 内存中。
3、JVM 通过调用类加载器自动创建这个类对应的Class对象,并且存储在 JVM 的方法区。
获得 Class 的三种方法:
(1)使用 Class 类的 forName静态方法
(2)调用 Object 的 getClass方法
反射创建实例对象
用 Class对象的 newInstance方法。用 Constructor对象的 newInstance 方法
java.lang.reflect包的核心接口和类
Member接口 - 反映关于单个成员(字段或方法)或构造函数的标识信息。Field类 - 提供一个类的域的信息以及访问类的域的接口。Method类 - 提供一个类的方法的信息以及访问类的方法的接口。Constructor类 - 提供一个类的构造函数的信息以及访问类的构造函数的接口。Array类 - 该类提供动态地生成和访问 JAVA 数组的方法。Modifier类 - 提供了 static 方法和常量,对类和成员访问修饰符进行解码。Proxy类 - 提供动态地生成代理类和类实例的静态方法。
【推荐课程:Java相关课程】
Atas ialah kandungan terperinci java基础反射Reflection简单介绍. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!