JAVA 快速了解反射
什么是反射
反射是 Java 编程语言的一个特性,它提供了在运行时检查和动态调用类、方法、属性的能力。
反射能做什么
反射可以在运行时检查类,接口,方法和变量。还可以实例化对象、调用方法、获取和设置变量值。比如当我们不知道一个类中是否拥有某个方法时,我们就可以使用反射来检查是否拥有这个方法。
反射常用类
常用类
Class:Class 类表示正在运行的 Java 程序中的类和接口。
Field:提供有关类或接口的单个域的信息和动态访问。如数据类型,访问修饰符,域的名称和值。
Method:提供有关类或接口上的单个方法的信息和访问权限。如访问修饰符,返回类型,名称,参数类型和方法的异常类型。
Constructor:提供有关类的单个构造函数的信息和访问权限。例如构造函数的访问修饰符,名称和参数类型。
Modifier:提供了有关访问修饰符的信息。
Class类常用方法
Class 类没有公共构造方法,可以通过以下方法获取 Class 实例。
1.Object 提供的 getClass() 方法。
2.类名.Class。
3.Class.forName(String className) 方法,className 为类的全限定名。
Field getField(String name) 获取指定的域对象
Field[] getFields() 返回所有的公有域对象数组
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回指定的方法对象
Method[] getMethods() 返回所有的公有方法对象数组
Method[] getDeclaredMethods() 返回所有方法对象数组
String getName() 获取全限定名
举例
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectDemo {
public int a;
private int b;
public static void main(String[] args) {
Class<ReflectDemo> reflectDemoClass = ReflectDemo.class;
//输出所有的域名称
for (Field declaredField : reflectDemoClass.getDeclaredFields()) {
//可以通过Modifier将具体的权限信息输出,否则只会显示代表权限的数值
System.out.println("域:" + declaredField.getName() + " 修饰符:" + Modifier.toString(declaredField.getModifiers()));
}
//输出所有的公有域名称
for (Field field : reflectDemoClass.getFields()) {
System.out.println("公有域:" + field.getName() + " 修饰符:" + Modifier.toString(field.getModifiers()));
}
//输出类的所有方法名
for (Method declaredMethod : reflectDemoClass.getDeclaredMethods()) {
System.out.println("方法:" + declaredMethod.getName() + " 修饰符:" + Modifier.toString(declaredMethod.getModifiers()));
}
public void fun1() {
}
private void fun2() {
}
}
}
输出结果
域:a 修饰符:public
域:b 修饰符:private
公有域:a 修饰符:public
方法:main 修饰符:public static
方法:fun1 修饰符:public
方法:fun2 修饰符:private