反射 Java 反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制
什么是反射 反射是 Java 编程语言的一个特性,它提供了在运行时检查和动态调用类、方法、属性的能力。
反射能做什么 反射可以在运行时检查类,接口,方法和变量。还可以实例化对象、调用方法、获取和设置变量值。比如当我们不知道一个类中是否拥有某个方法时,我们就可以使用反射来检查是否拥有这个方法。
反射常用类 常用类:
Class:Class 类表示正在运行的 Java 程序中的类和接口。 Field:提供有关类或接口的单个域的信息和动态访问。如数据类型,访问修饰符,域的名称和值。 Method:提供有关类或接口上的单个方法的信息和访问权限。如访问修饰符,返回类型,名称,参数类型和方法的异常类型。 Constructor:提供有关类的单个构造函数的信息和访问权限。例如构造函数的访问修饰符,名称和参数类型。 Modifier:提供了有关访问修饰符的信息。 Class:
Class 类没有公共构造方法,可以通过以下方法获取 Class 类。
Object 提供的 getClass()方法。 类名.Class Class.forName(String className)方法。className 为类的全限定名。 Class 类常用方法:
方法 描述 Field getField(String name) 获取指定的域对象 Field[] getFields() 返回所有的公有域对象数组 Method getDeclaredMethod(String name, Class<?>… parameterTypes) 返回指定的方法对象 Method[] getMethods() 返回所有的公有方法对象数组 Method[] getDeclaredFields() 返回所有方法对象数组 String getName() 获取全限定名 更多方法请查阅官方文档
编程实战 在/home/project/目录下新建ReflectDemo.java。
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 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() {
}
} 编译运行:
javac ReflectDemo.java java ReflectDemo copy 运行结果:
域:a 修饰符:public 域:b 修饰符:private 公有域:a 修饰符:public 方法:main 修饰符:public static 方法:fun1 修饰符:public 方法:fun2 修饰符:private