当我们使用 Java 开发时,有时需要获取某个类的信息,例如类的属性、方法和构造函数等,然后在程序运行期间动态地操作它们。Java 反射就是用来实现这个目的的一种机制。
Java 反射(Reflection)是 Java 编程语言在运行时动态获取类的信息以及动态调用对象方法的能力。它可以让程序在运行时动态地操作对象,这使得程序更加灵活。使用反射机制,我们可以在运行时获得类的信息,而不是在编译时确定。
Java 反射提供了以下类来完成相关操作:
Class:用于表示类对象;
Field:用于表示类的属性;
Method:用于表示类的方法;
Constructor:用于表示类的构造函数。
下面是一些反射常用的方法:
获取类对象
获取一个类的 Class 对象有多种方法:
使用 Class.forName(String className) 方法,需要传入类的全限定名,会返回该类的 Class 对象。
使用类名.class,例如 String.class。
使用对象.getClass() 方法,返回对象所属的类的 Class 对象。
获取类的属性
使用 Class 类的 getField(String name) 方法可以获取类的指定公有属性;使用 getDeclaredField(String name) 方法可以获取类的指定属性(无论是否公有)。
获取类的方法
使用 Class 类的 getMethod(String name, Class… parameterTypes) 方法可以获取类的指定公有方法;使用 getDeclaredMethod(String name, Class… parameterTypes) 方法可以获取类的指定方法(无论是否公有)。
获取类的构造函数
使用 Class 类的 getConstructor(Class… parameterTypes) 方法可以获取类的指定公有构造函数;使用 getDeclaredConstructor(Class… parameterTypes) 方法可以获取类的指定构造函数(无论是否公有)。
动态调用方法
通过反射可以动态调用类的方法,例如:
Class clazz = Class.forName("com.example.MyClass");Object obj = clazz.newInstance();Method method = clazz.getMethod("myMethod", String.class);method.invoke(obj, "parameter");
上述代码中,我们先获取 MyClass 的 Class 对象,然后创建 MyClass 的一个实例,接着获取 myMethod 方法的 Method 对象,最后使用 invoke 方法调用 myMethod 方法并传入参数。
这就是 Java 反射的基本使用方法,如果还不是不明白,请看我下篇文章将写几个简单的例子详细介绍怎么使用。