简介
Java反射机制是让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。通过反射还可以在运行期实例化对象,调用方法,获取实例变量,甚至是私有的实例变量。
小试牛刀
// 获取类的方法列表
Method[] methods = Person.class.getMethods();
for (Method method : methods) {
System.out.println("method = " + method.getName());
}
Class 对象
想要检查一个类的信息,首先得获取到类的 Class 对象。 在 Java 中所有的类型(包括基本类型,数组)都有与之相对应的 Class
对象。 可以通过多种方式获取类的 Class
对象。
如果在编译期就知道一个类的名字了,你可以通过 .class
获取类的 Class
对象
Class<Person> perconClass = Person.class;
如果编译器不知到类的名字,但是在运行期间可以获得类全名的字符串,你可以这样
// 类全名
String className = "com.project.bean.Person";
Class<?> personClass = Class.forName(className);
还可以通过对象的实例获取
Person person = new Person();
Class<?> personClass = person.getClass();
包信息
通过 Class
对象获取类的包信息 (Package
对象)
// 获取包对象
Package pkg = personClass.getPackage();
// 通过包对象获取包名
String packageName = pkg.getName();
获取类名
通过 Class 对象获取类名
全限定类名(包名 + 类名)
personClass.getName()
简单类名(不包含包名)
personClass.getSimpleName()
修饰符
通过 Class 对象获取类的修饰符,public, private, static等关键字
int mod = personClass.getModifiers()
返回的是一个 int 型的数值,它是标识符的标志,可以通过 java.lang.reflect.Modifier
类的 toString(int mod)
方法转换成字符
String modStr = Modifier.toString(modifiers);
父类 Class 对象
获取父类的 Class 对象
Class<?> superClass = personClass.getSuperclass();
实现的接口
获取实现接口的 Class
对象
Class<?>[] interfaces = personClass.getInterfaces();
因为一个类可以实现多个接口,所以返回的是一个 Class
数组
注解
获取对象的注解信息(Annotation
对象)
Annotation[] annotations = personClass.getAnnotations();
构造器
获取 public 修饰的构造器信息
Constructor<?>[] constructors = personClass.getConstructors();
方法
通过 Class 对象获取类的方法信息 (Method
对象)
// 所有 public 修饰的方法信息(包括父类)
Method[] methods = Person.class.getMethods();
属性
获取对象的属性信息(Field
对象)
// 获取该类的所有 public 属性(包括父类)
Field[] fields = personClass.getFields();
// 获取该类中定义的所有属性
Field[] fields = personClass.getDeclaredFields();
构造器 (Constructor 对象)
我们知道构造器主要是用来创建并初始化一个对象,我们除了通过 new 创建对象,还可以通过 Constructor
来创建一个对象
网友评论