JAVA中的反射机制
概述
在Java环境中,反射机制允许程序在执行时获取某个类自身的定义信息,例如熟悉和方法等也可以实现动态创建类的对象、变更属性的内容或执行特定的方法的功能。从而使Java具有动态语言的特性,增强了程序的灵活性和可移植性。(反射机制是在运行状态下)
一、用途
Java反射机制主要用于实现以下功能。
(1)在运行时判断任意一个对象所属的类型。
(2)在运行时构造任意一个类的对象。
(3)在运行时判断任意一个类所具有的成员变量和方法。
(4)在运行时调用任意一个对象的方法,甚至可以调用private方法。
二、反射相关的API
实现Java反射机制的API在Java.lang.reflect包下,具有以下几点。
(1)Class类:代表一个类。
(2)Filed类:代表类的成员变量。
(3)Method类:代表类的方法。
(4)Constructor类:代表类的构造方法。
(5)Array类:提供了动态创建数组及访问数组元素的静态方法。该类中的 所有方法都是静态的。
1.class类
class代表类的实体,在运行的java应用程序中表示类和接口。
java文件被编译后生成了.class文件,被编译后的java文件.class也被JVM解析为一个对象,这个对象就是java.lang.class . 这样当程序在运行时,每个java文件就最终变成了class类对象的一个实例**(这个class 对象存放在方法区,不在堆里)**。我们通过java的反射机制应用到这个实例,**就可以获得甚至去添加改变这个类的属性和动作,**使得这个类成为一个动态的类。
常见的获得类相关的方法
getClassLoader() //获得类的加载器
getDeclaredClasses() //返回一个数组,数组中包含该类中所有的接口类的对象(包括私有的)
forName(String className) //根据类名返回类的对象
newInstance() //创建类的实例
getName() //获得类的完整路径名字
2.field 类 :属性相关
常见的获得类中属性相关的方法
getField() // 获得某个公有的属性对象
getFields() //获得所有公有的属性对象
getDeclaredField(String name) // 获得某个属性对象
getDeclaredFields() //获得所有属性对象
3.Constructor 类 : 构造器相关
getConstructor(Class...<?> parameterTypes) //获得该类中与参数类型匹配的公有构造方法
getConstructors() //获得该类的所有公有构造方法
getDeclaredConstructor(Class...<?> parameterTypes) //获得该类中与参数类型匹配的构造方法
getDeclaredConstrucor() //获得该类所有构造方法
4.Method类 : 方法相关
getMethod(String name,Class..<?> parameterTypes) //获得该类某个公有方法
getMethods() //获得该类所有公有方法
getDeclaredMethod(String name,Class...<?> parameterTypes) //获得该类某个方法
getDeclaredMethods() //获得该类所有方法
5.所有和反射相关的包都在import java.lang.reflect 包下面
java.lang.reflect.Constructor
java.lang.reflect.Field
java.lang.reflect.Method
三、反射优点和缺点
优点:
1.对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法
2.增加程序的灵活性和扩展性,降低耦合性,提高自适应能力
3.发射已经运用在很多流行框架如:Struts、Hibernate、Spring 等
缺点:
1.反射会有效率问题,会降低程序的效率
2.反射技术绕过了源代码的技术,会带来维护问题。反射代码比相应的直接代码更复杂。
四、反射的步骤
1.首先获得当前类的Class对象
- 使用Class.forName(“类的全路径名”);静态方法
- 使用类名 .class 方法
- 使用类对象 getClass()方法
2.获得class对象后,通过对应的方法获取类的属性和方法或者构造函数等。
以上就是我所理解的相关反射(reflection)的内容。