public interface IStudent {
int cardId=1024;
}
public class Person {
String personName;
}
public class Student extends Person implements IStudent{
public static final int NUM=3;
private String name;
/*package*/ int age;
protected Object obj;
public ArrayList<Integer> ids;
public Student(String name,int age){
this.name=name;
this.age=age;
}
/**getDeclaredFields()方法說明
* Returns an array of Field objects reflecting all the fields declared by the class or interface represented by this Class object.
* This includes public, protected, default (package) access, and private fields, but excludes inherited fields.
* The elements in the array returned are not sorted and are not in any particular order.
* This method returns an array of length 0 if the class or interface declares no fields,
* or if this Class object represents a primitive type, an array class, or void.
*
* 返回一個Field對象數組,它是通過反射所有在類或接口中申明的字段得到的,代表這個類字節碼對象。
* 返回的Field包含public protected package private修飾的字段,即所有訪問權限的字段。但不包括繼承或實現的接口的字段。
* Field數組中的元素是無序的。
* 當類或接口中沒有任何字段,則返回數組的length為0.
* 當為基本類型或者是數組類型,void類型返回的數組長度也為0.
*
*
*/
public static void main(String[] args) {
//Student字節碼
Class<Student> clazz = Student.class;
Field[] fields = clazz.getDeclaredFields();
printFields(fields);
/* 輸出結果:
* DeclaredFields.length=5
public static final int NUM
private String name
int age
protected Object obj
public ArrayList ids */
//IStudent字節碼
Class<IStudent> clazzIStudent = IStudent.class;
Field[] fields2 = clazzIStudent.getDeclaredFields();
printFields(fields2);
/*
* DeclaredFields.length=1
public static final int cardId
*/
//基本類型字節碼
Class clazzInteger = void.class;// int[].class void.class 返回length也為0
Field[] fields3 = clazzInteger.getDeclaredFields();
printFields(fields3);
/*輸出
* DeclaredFields.length=0
* */
}
public static void printFields(Field[] fields) {
System.out.println("DeclaredFields.length="+fields.length);
for(Field field:fields){
StringBuilder sb = new StringBuilder();
sb.append(Modifier.toString(field.getModifiers())).append(" ")/*修飾符*/
.append(field.getType().getSimpleName()).append(" ")/*類型*/
.append(field.getName()).append(" ")/*成員變量名*/
;
System.out.println(sb.toString());
}
System.out.println("----------------");
}
}
public class StudentTest {
/**
* 反射獲取對象的成員變量值
*/
public static void main(String[] args) {
Student student = new Student("lisi",19);
try {
/*獲取對象的字段值*/
Field field = student.getClass().getDeclaredField("age");/*public*/
Field field2 = student.getClass().getDeclaredField("name");/*private*/
field2.setAccessible(true);
Field field3 = student.getClass().getDeclaredField("NUM");/*public static final*/
System.out.println(field.get(student));
System.out.println(field2.get(student));
System.out.println(field3.get(student));
/*public static 直接在類字節碼中,也可從類字節碼中直接獲取而不通過對象*/
System.out.println(field3.get(null));
/*輸出
* 19
lisi
3
3*/
} catch (Exception e) {
e.printStackTrace();
}
}
}