百度百科对Java反射的定义:JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
举一个我使用到反射的例子:有一个类,它内部用一个private方法获取到了原始信息,然后在对外public方法中将数据过滤返回。我现在想拿到原始数据,通过普通途径是拿不到的,这时候就可以通过反射实现。
Java反射涉及到4个类和一个接口。四个类是Class类、Field类、Method类、Constructor类(后面三个类都属于Java 反射类库java.lang.reflect),一个接口是Member接口。
一般使用反射,代码步骤就是:
有这样一个类,可以看到其构造器、属性和方法都是私有的(toString方法是一会儿用来验证的),普通的手段是无法使用这个类的。
目标类
现在通过反射来使用这个类:
通过反射操作构造器、方法、属性
最后看一下运行结果:
运行结果
看了上面的例子应该对Java反射有了整体的理解。但上面的例子仍旧太简单了,因为Java反射还提供了很多其他的接口可供调用。
获取Class对象
上面例子中是一种获取Class对象的方式,获取Class对象的方式有很多种:
常见的获取Class对象的方法
Constructor对象
Class提供4种获取Constructor对象的方法。
//获取指定的构造器(任何访问类型的构造器、注意是可变参数) Class.getDeclaredConstructor(Class<?>... parameterTypes); //获取指定的public构造器(注意是可变参数) Class.getConstructor(Class<?>... parameterTypes); //获取所有构造器(任何访问类型的构造器),返回Constructor数组 Class.getDeclaredConstructors(); //获取所有public构造器,返回Constructor数组 Class.getConstructors();
Field对象
Class提供4种获取Field对象的方法。
和获取Constructor对象类似。
现在再看看上面写的:
Field类:实现了Member接口。该类针对属性。该类提供了获取属性的类型、修饰符、注解、变量名、值以及修改属性值的功能(包括private属性)
例子种修改属性值是通过set方法实现的。其他提到的这些功能,Field都有相应的方法可供调用。只需简单查询接口文档即可。
获取Method对象
Class提供4种获取Method对象的方法。
和获取Constructor对象类似。
Method类:实现了Member接口。该类针对方法。该类提供了获取方法返回类型、方法参数类型、方法参数名称、方法抛出异常类型、方法修饰符,以及通过反射调用方法等功能。
例子中通过反射调用方法使用的是invoke()方法。其他提到的功能,Method都有相应的方法可供调用。只需要简单的查询接口文档即可。