在Java运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称Java语言的反射机制。通俗点讲,通过反射,该类对我们来说是完全透明的,想要获取任何东西都是可以的。
示例代码:
package com.demo.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class<?> class = Class.forName("com.demo.reflect.Person");
//通过反射机制获取构造器
System.out.println("-------获取构造器Constructor--------");
Constructor<?>[] constructors = class.getDeclaredConstructors();
for (Constructor<?> constructor : constructors) {
StringBuilder builder = new StringBuilder();
// 获取修饰符Modifier
builder.append("\t" + Modifier.toString(constructor.getModifiers()));
// 获取名称
builder.append(" " + constructor.getName());
// 获取形参列表数据类型ParameterTypes
builder.append("(");
Class<?>[] parameterTypes = constructor.getParameterTypes();
for (Class<?> parameterType : parameterTypes) {
builder.append(parameterType.getSimpleName() + ", ");
}
builder.append(")");
System.out.println(builder.toString());
}
// 通过反射机制获取方法
System.out.println("-----方法Method:-----");
Method[] methods = class.getDeclaredMethods();
for (Method method : methods) {
StringBuilder builder = new StringBuilder();
// 获取修饰符Modifier
builder.append("\t" + Modifier.toString(method.getModifiers()));
// 获取返回值ReturnType
Class<?> returnType = method.getReturnType();
builder.append(" " + returnType.getSimpleName());
// 获取方法名称
builder.append(" " + method.getName());
// 获取形参列表数据类型ParameterTypes
builder.append("(");
Class<?>[] rarameterTypes = method.getParameterTypes();
for (Class<?> rarameterType : rarameterTypes) {
builder.append(rarameterType.getSimpleName() + ", ");
}
builder.append(")");
System.out.println(builder.toString());
}
}
}
代码执行结果如下: