因为演示需要,所以把Person类尽量的造得尽可能的复杂,如下
Person类:
@MyAnnotation(value = "PeterLi") public class Person extends Creature<String> implements Comparable, MyInterface { public String name; private int age; int id; protected boolean sex; //创建类时,尽量保留一个空参的构造器 public Person() { // System.out.println("今天天气很闷热"); } public Person(String name) { this.name = name; } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @MyAnnotation(value = "abc123") public void show() { System.out.println("我是一个人!"); } public void display(String nation) throws Exception{ System.out.println("我的国籍是" + nation); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public int compareTo(Object o) { return 0; } class Bird{ } }
Creature父类:
public class Creature<T> { public double weight; public void breath() { System.out.println("呼吸"); } }
MyInterface接口:
public interface MyInterface extends Serializable { }
MyAnnotation注解:
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) @Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { String value(); }
下面是代码示例:
public class TestField { //获取对应的运行时类的属性 @Test public void test1() { Class clazz = Person.class; //1.getFields:只能获取到运行时类中及其父类中声明为public的属性 Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field); } System.out.println(); //2.getDeclaredFields():获取运行时类本身声明的所有的属性 Field[] fields1 = clazz.getDeclaredFields(); for (Field f : fields1) { System.out.println(f); } } //权限修饰符 变量类型 变量名 //获取属性的各个部分的内容 @Test public void test2() { Class clazz = Person.class; Field[] fields1 = clazz.getDeclaredFields(); for (Field f : fields1) { //1.获取每个属性的权限修饰符 int i = f.getModifiers(); String str1 = Modifier.toString(i); System.out.print(i); System.out.print(" " + str1 + " "); //2.获取属性的变量类型 Class type = f.getType(); System.out.print("属性的变量类型:" + type.getName() + " "); //3.获取属性名 System.out.print(f.getName()); System.out.println(); } } }
test1结果:
public java.lang.String com.peter.java19.Person.name
public double com.peter.java19.Creature.weightpublic java.lang.String com.peter.java19.Person.name
private int com.peter.java19.Person.age
int com.peter.java19.Person.id
protected boolean com.peter.java19.Person.sextest2结果:
1 public 属性的变量类型:java.lang.String name
2 private 属性的变量类型:int age
0 属性的变量类型:int id
4 protected 属性的变量类型:boolean sex