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();
}
}
}