简介
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[] 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() {
}
}
总结
反射虽然提供了强大的能力,但是确会带来很多问题,如性能降低,权限漏洞以及权限问题。所以能不用反射尽量不用。