新建一個Person類
1 package cn.tx.reflect; 2 3 /** 4 * 注解初步了解 5 * @author Administrator 6 * 7 */ 8 public class Person { 9 private Integer id; 10 private String name; 11 private String address; 12 13 14 public Person() { 15 super(); 16 } 17 18 public Person(Integer id, String name, String address) { 19 super(); 20 this.id = id; 21 this.name = name; 22 this.address = address; 23 } 24 25 public String getName() { 26 return name; 27 } 28 public Integer getId() { 29 return id; 30 } 31 public void setId(Integer id) { 32 this.id = id; 33 } 34 public void setName(String name) { 35 this.name = name; 36 } 37 public String getAddress() { 38 return address; 39 } 40 public void setAddress(String address) { 41 this.address = address; 42 } 43 44 public static void printInfo(){ 45 System.out.println("靜態方法反射調用"); 46 } 47 48 @Override 49 public String toString() { 50 return "Person [address=" + address + ", id=" + id + ", name=" + name 51 + "]"; 52 } 53 54 55 }
1 package cn.tx.reflect; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 import java.util.Arrays; 7 /** 8 * 一、反射獲取類的屬性,方法,構造器 9 * @author Administrator 10 * 11 */ 12 public class ReflectLearn1 { 13 14 private static String className = "java.lang.String"; 15 public static void main(String[] args) throws Exception { 16 // <?>中的問號為泛型,表示不知道后面list對象 中存放的實際類型是什么,用?表示 17 // List<?> list = new ArrayList(); 18 19 // 1.根據一個類的全路徑名獲取一個類的類對象:Class對象 20 21 Class<?> clazz = Class.forName(className); 22 23 // 2.獲得傳遞過來的類(上面的String類)的所有聲明方法——目的就是為了調用獲得的方法 24 Method[] methods = clazz.getDeclaredMethods(); 25 for (Method m : methods) { 26 System.out.println(m); 27 } 28 29 // 3.獲得類的所有聲明的屬性——目的:設置屬性或者是獲取屬性值,或者是獲取屬性上的注解! 30 System.out.println("-------------獲得類的所有聲明的屬性---------------"); 31 Field[] fields = clazz.getDeclaredFields(); 32 for (Field field : fields) { 33 System.out.println(field); 34 } 35 36 // 4.獲得類的所有構造器——創建對象 37 System.out.println("--------------獲得類的所有構造器--------------"); 38 Constructor<?>[] constructors = clazz.getDeclaredConstructors(); 39 for (Constructor<?> constructor : constructors) { 40 System.out.println(constructor); 41 } 42 43 //5.獲取一個類的Class對象的三種方式: 44 //(1)知道類的全路徑名,Class<?> clazz = Class.forName("類的全路徑名"); 45 //(2)知道該類的一個對象 Class<?> clazz = 對象名.getClass(); 46 //(3)知道類的名字: Class<?> clazz = 類名.class; 47 System.out.println("----------獲取Person類的信息-------------"); 48 Person p = new Person(); 49 test(p); 50 /* test(p);打印結果如下 51 * ----------獲取Person類的信息------------- 52 public java.lang.String cn.tx.Person.toString() 53 public java.lang.String cn.tx.Person.getAddress() 54 public java.lang.String cn.tx.Person.getName() 55 public java.lang.Integer cn.tx.Person.getId() 56 public void cn.tx.Person.setName(java.lang.String) 57 public void cn.tx.Person.setId(java.lang.Integer) 58 public void cn.tx.Person.setAddress(java.lang.String) 59 -------------獲得類的所有聲明的屬性--------------- 60 private java.lang.Integer cn.tx.Person.id 61 private java.lang.String cn.tx.Person.name 62 private java.lang.String cn.tx.Person.address 63 --------------獲得類的所有構造器-------------- 64 public cn.tx.Person() 65 public cn.tx.Person(java.lang.Integer,java.lang.String,java.lang.String) 66 * */ 67 //(3) 68 69 70 } 71 72 /** 73 * Class<? extends Object> 74 * @param obj 75 */ 76 public static void test(Object obj){ 77 //Class<? extends Object>表示通過反射獲取的對象的類型不確定,但是一定是Object類的子類 78 //等價於Class<?> clazz = obj.getClass(); 79 Class<? extends Object> clazz = obj.getClass(); 80 // 2.獲得傳遞過來的類(上面的String類)的所有方法——目的就是為了調用獲得的方法 81 Method[] methods = clazz.getDeclaredMethods(); 82 for (Method m : methods) { 83 System.out.println(m); 84 } 85 86 // 3.獲得類的所有聲明的屬性——目的:設置屬性或者是獲取屬性值 87 System.out.println("-------------獲得類的所有聲明的屬性---------------"); 88 Field[] fields = clazz.getDeclaredFields(); 89 for (Field field : fields) { 90 System.out.println(field); 91 } 92 93 // 4.獲得類的所有構造器——創建對象 94 System.out.println("--------------獲得類的所有構造器--------------"); 95 Constructor<?>[] constructors = clazz.getDeclaredConstructors(); 96 for (Constructor<?> constructor : constructors) { 97 System.out.println(constructor); 98 } 99 } 100 101 }