天天看点

反射获取类基本结构信息1、获取包名称

1、获取包名称

Class<?> clazz = Person.class;
// 获取包对象
Package p = clazz.getPackage();
// 获取包名称
String packageName = p.getName();
           

2、获取父类class对象

Class<?> clazz = Person.class;
Class<?> superClazz = clazz.getSuperclass();
           

3、获取实现的接口的class对象

Class<?> clazz = Person.class;
// 获取类实现的接口class对象
Class<?>[] clazzInterfaces = clazz.getInterfaces();
           

4、获取构造器及实例化

Class<?> clazz = Person.class;
// 获取本类所有构造器
Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors();
// 获取所有(包括父类)public构造器
Constructor<?>[] constructors = clazz.getConstructors();
// 获取本类指定参数的构造器
Constructor<?> specifiedConstructor = clazz.getDeclaredConstructor(String.class);
// 有参构造的实例化
Object instance = specifiedConstructor.newInstance("hellow");
           

5、获取方法及方法调用

Class<?> clazz = Person.class;
// 获取本类所有方法
Method[] declaredMethods = clazz.getDeclaredMethods();
// 获取所有(包括父类)public方法
Method[] methods = clazz.getMethods();
// 获取本类指定名称的方法
Method method = clazz.getDeclaredMethod("setName");
// 调用方法,需要实例化对象
Object obj = clazz.getDeclaredConstructors().newInstance();
method.invoke(obj, "hellow");

// 获取方法名称
String name = method.getName();
// 获取修饰符
int mod = method.getModifiers();
String modName = Modifier.toString(mod);
// 获取返回类型
Class<?> returnType = method.getReturnType();
// 获取参数类型
Class<?>[] parameterTypes = method.getParameterTypes();
// 获取异常
Class<?>[] exceptionTypes = method.getExceptionTypes();
           

6、调用类成员

Class<?> clazz = Person.class;
Object obj = clazz.getDeclaredConstructor().newInstance();
// 获取本类所有成员
Field[] declaredFields = clazz.getDeclaredFields();
// 获取所有(包括父类)public成员
Field[] fields = clazz.getFields();
// 获取本类指定成员
Field field = clazz.getDeclaredField("name");
// 获取成员属性值,需要实例化对象
// 若成员修饰符不为public,需要解除封装field.setAccessible(true);
Object value = field.get(obj);
// 获取成员类型
Class<?> type = field.getType();
// 获取类型完整名称,如:java.lang.String
type.getName();
// 获取类型简单名称,如:String
type.getSimpleName();