一、獲取類的結構屬性。
@Test
public void test1(){
Class clazz = Person.class;
//獲取屬性結構
//getFields():獲取當前運行時類及其父類中聲明爲public訪問權限的屬性
Field[] fields = clazz.getFields();
for(Field f : fields){
System.out.println(f);
}
System.out.println();
//getDeclaredFields():獲取當前運行時類中聲明的所有屬性。(不包含父類中聲明的屬性)
Field[] declaredFields = clazz.getDeclaredFields();
for(Field f : declaredFields){
System.out.println(f);
}
}
二、獲取類結構屬性的權限修飾符,數據類型,變量名。
@Test
public void test2(){
Class clazz = Person.class;
Field[] declaredFields = clazz.getDeclaredFields();
for(Field f : declaredFields){
//1.權限修飾符
int modifier = f.getModifiers();
System.out.print(Modifier.toString(modifier) + "\t");
//2.數據類型
Class type = f.getType();
System.out.print(type.getName() + "\t");
//3.變量名
String fName = f.getName();
System.out.print(fName);
System.out.println();
}
}
三、獲取類結構屬性——具體方法。
@Test
public void test1(){
Class clazz = Person.class;
//getMethods():獲取當前運行時類及其所有父類中聲明爲public權限的方法
Method[] methods = clazz.getMethods();
for(Method m : methods){
System.out.println(m);
}
System.out.println();
//getDeclaredMethods():獲取當前運行時類中聲明的所有方法。(不包含父類中聲明的方法)
Method[] declaredMethods = clazz.getDeclaredMethods();
for(Method m : declaredMethods){
System.out.println(m);
}
}
四、獲取構造器結構
@Test
public void test1(){
Class clazz = Person.class;
//getConstructors():獲取當前運行時類中聲明爲public的構造器
Constructor[] constructors = clazz.getConstructors();
for(Constructor c : constructors){
System.out.println(c);
}
System.out.println();
//getDeclaredConstructors():獲取當前運行時類中聲明的所有的構造器
Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
for(Constructor c : declaredConstructors){
System.out.println(c);
}
}
五、獲取運行時類的父類
/*
獲取運行時類的父類
*/
@Test
public void test2(){
Class clazz = Person.class;
Class superclass = clazz.getSuperclass();
System.out.println(superclass);
}
六、 獲取類的帶泛型的父類
@Test
public void test3(){
Class clazz = Person.class;
Type genericSuperclass = clazz.getGenericSuperclass();
System.out.println(genericSuperclass);
}
七、獲取類的帶泛型的父類的泛型
@Test
public void test4(){
Class clazz = Person.class;
Type genericSuperclass = clazz.getGenericSuperclass();
ParameterizedType paramType = (ParameterizedType) genericSuperclass;
//獲取泛型類型
Type[] actualTypeArguments = paramType.getActualTypeArguments();
// System.out.println(actualTypeArguments[0].getTypeName());
System.out.println(((Class)actualTypeArguments[0]).getName());
}
八、獲取運行時類實現的接口
/*
獲取運行時類實現的接口
*/
@Test
public void test5(){
Class clazz = Person.class;
Class[] interfaces = clazz.getInterfaces();
for(Class c : interfaces){
System.out.println(c);
}
System.out.println();
//獲取運行時類的父類實現的接口
Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
for(Class c : interfaces1){
System.out.println(c);
}
}
九、獲取運行時類所在的包
/*
獲取運行時類所在的包
*/
@Test
public void test6(){
Class clazz = Person.class;
Package pack = clazz.getPackage();
System.out.println(pack);
}
十、獲取運行時類聲明的註解
/*
獲取運行時類聲明的註解
*/
@Test
public void test7(){
Class clazz = Person.class;
Annotation[] annotations = clazz.getAnnotations();
for(Annotation annos : annotations){
System.out.println(annos);
}
}
十一、調用運行時類中指定的結構:屬性、方法、構造器
/*
如何操作運行時類中的指定的屬性 -- 需要掌握
*/
@Test
public void testField1() throws Exception {
Class clazz = Person.class;
//創建運行時類的對象
Person p = (Person) clazz.newInstance();
//1. getDeclaredField(String fieldName):獲取運行時類中指定變量名的屬性
Field name = clazz.getDeclaredField("name");
//2.保證當前屬性是可訪問的
name.setAccessible(true);
//3.獲取、設置指定對象的此屬性值
name.set(p,"Tom");
System.out.println(name.get(p));
}
/*
如何操作運行時類中的指定的方法 -- 需要掌握
*/
@Test
public void testMethod() throws Exception {
Class clazz = Person.class;
//創建運行時類的對象
Person p = (Person) clazz.newInstance();
/*
1.獲取指定的某個方法
getDeclaredMethod():參數1 :指明獲取的方法的名稱 參數2:指明獲取的方法的形參列表
*/
Method show = clazz.getDeclaredMethod("show", String.class);
//2.保證當前方法是可訪問的
show.setAccessible(true);
/*
3. 調用方法的invoke():參數1:方法的調用者 參數2:給方法形參賦值的實參
invoke()的返回值即爲對應類中調用的方法的返回值。
*/
Object returnValue = show.invoke(p,"CHN"); //String nation = p.show("CHN");
System.out.println(returnValue);
System.out.println("*************如何調用靜態方法*****************");
// private static void showDesc()
Method showDesc = clazz.getDeclaredMethod("showDesc");
showDesc.setAccessible(true);
//如果調用的運行時類中的方法沒有返回值,則此invoke()返回null
// Object returnVal = showDesc.invoke(null);
Object returnVal = showDesc.invoke(Person.class);
System.out.println(returnVal);//null
}
/*
如何調用運行時類中的指定的構造器
*/
@Test
public void testConstructor() throws Exception {
Class clazz = Person.class;
//private Person(String name)
/*
1.獲取指定的構造器
getDeclaredConstructor():參數:指明構造器的參數列表
*/
Constructor constructor = clazz.getDeclaredConstructor(String.class);
//2.保證此構造器是可訪問的
constructor.setAccessible(true);
//3.調用此構造器創建運行時類的對象
Person per = (Person) constructor.newInstance("Tom");
System.out.println(per);
}
}