天天看點

反射擷取類基本結構資訊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();