1 獲得所有公共的構造方法 2 獲得所有的構造方法 3 獲得公有 無參的構造方法 4 獲得公有 有參的構造方法 5 獲得私有 有參的構造方法 6 獲得所有公共的方法 7 獲得所有方法 8 獲取公有 無參方法 9 獲取公有 有參方法 10 獲取私有 有參方法 11 獲取所有屬性 12 獲得屬性值 ...
1 package com.test; 2 3 public class Student { 4 5 private int stuNum; 6 private String stuName; 7 private String stuClass; 8 9 private Student(int stuNum) { 10 this.stuNum = stuNum; 11 } 12 Student(int stuNum, String stuName) { 13 this.stuNum = stuNum; 14 this.stuName = stuName; 15 } 16 public Student() { 17 18 } 19 public Student(int stuNum, String stuName, String stuClass) { 20 this.stuNum = stuNum; 21 this.stuName = stuName; 22 this.stuClass = stuClass; 23 } 24 25 public void show1(String stuName){ 26 System.out.println("公共 String參數的show1():stuName=" + stuName); 27 } 28 public void show2() { 29 System.out.println("公共無參的show2()"); 30 } 31 protected void show3(){ 32 System.out.println("受保護的 無參的show2()"); 33 } 34 void show4(){ 35 System.out.println("預設的 無參的show3()"); 36 } 37 private String show5(int stuNum){ 38 System.out.println("私有 有返回值的,int參數的show4():age=" + stuNum); 39 return stuNum+"abc"; 40 } 41 42 public int getStuNum() { 43 return stuNum; 44 } 45 public void setStuNum(int stuNum) { 46 this.stuNum = stuNum; 47 } 48 public String getStuName() { 49 return stuName; 50 } 51 public void setStuName(String stuName) { 52 this.stuName = stuName; 53 } 54 public String getStuClass() { 55 return stuClass; 56 } 57 public void setStuClass(String stuClass) { 58 this.stuClass = stuClass; 59 } 60 61 @Override 62 public String toString() { 63 return "Student [stuNum=" + stuNum + ", stuName=" + stuName + ", stuClass=" + stuClass + "]"; 64 } 65 }
1 package com.test; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 7 public class Test { 8 9 public static void main(String[] args) throws Exception { 10 11 /** 12 * java中的反射機制就是對於任意一個類,都能知道這個類的所有屬性和方法, 13 * 對於任意一個對象,都能夠調用它的任意一個屬性和方法, 14 * 這種動態獲取信息以及動態調用對象的方法就是java語言中的反射 15 * */ 16 17 Class clazz1 = Student.class; //第一種:任何一個類都有一個隱含的靜態成員變數class 18 19 Class clazz2 = new Student().getClass(); //第二種:已經有了該類的對象通過getClass方法 20 21 System.out.println("clazz1 == clazz2 : "+(clazz1 == clazz2)); //clazz1 == clazz2 : true 22 23 Class clazz3 = Class.forName("com.test.Student"); //第三種:動態載入 24 25 System.out.println("clazz2 == clazz3 : "+(clazz2 == clazz3)); //clazz2 == clazz3 : true 26 27 28 System.out.println("------獲取所有構造方法------"); 29 30 Constructor[] conArr = clazz3.getDeclaredConstructors(); 31 for(Constructor c : conArr){ 32 // public com.test.Student(int,java.lang.String,java.lang.String) 33 // public com.test.Student() 34 // com.test.Student(int,java.lang.String) 35 // private com.test.Student(int) 36 System.out.println(c); 37 } 38 39 System.out.println("------公共無參的構造方法------"); 40 41 /*因為是無參的構造方法所以類型是一個null,不寫也可以:這裡需要的是一個參數的類型,切記是類型 返回的是描述這個無參構造函數的類對象*/ 42 Constructor con = clazz3.getConstructor(); 43 //調用構造方法 44 Object obj = con.newInstance(); 45 Student stu = (Student) obj; 46 System.out.println(stu); //Student [stuNum=null, stuName=null, stuClass=null] 47 48 System.out.println("------公共有參的構造方法------"); 49 50 con = clazz3.getConstructor(int.class, String.class, String.class); 51 //使用此 Constructor對象表示的構造方法來創建該構造方法的聲明類的新實例,並用指定的初始化參數初始化該實例 52 obj = con.newInstance(100023,"chenkaixin","150101"); 53 stu = (Student) obj; 54 System.out.println(stu); //Student [stuNum=null, stuName=null, stuClass=null] 55 56 System.out.println("------私有有參的構造方法------"); 57 58 con = clazz3.getDeclaredConstructor(int.class); 59 //啟用或禁用安全檢查 訪問私有的方法或變數時必須設置為true 60 con.setAccessible(true); 61 //調用構造方法 62 obj = con.newInstance(100023); 63 stu = (Student) obj; 64 System.out.println(stu); //Student [stuNum=100023, stuName=null, stuClass=null] 65 66 System.out.println("------獲取所有方法------"); 67 68 Method[] methodArr = clazz3.getDeclaredMethods(); 69 for(Method m : methodArr){ 70 // public java.lang.String com.test.Student.toString() 71 // public int com.test.Student.getStuNum() 72 // public void com.test.Student.show2() 73 // public void com.test.Student.setStuName(java.lang.String) 74 // void com.test.Student.show4() 75 // private java.lang.String com.test.Student.show5(int) 76 // public java.lang.String com.test.Student.getStuName() 77 // public java.lang.String com.test.Student.getStuClass() 78 // public void com.test.Student.show1(java.lang.String) 79 // protected void com.test.Student.show3() 80 // public void com.test.Student.setStuClass(java.lang.String) 81 // public void com.test.Student.setStuNum(int) 82 System.out.println(m); 83 } 84 85 System.out.println("------公共無參方法------"); 86 87 Method m = clazz3.getMethod("show2"); 88 //執行這個方法 89 m.invoke(obj); //公共無參的show2() 90 91 System.out.println("------公共有參方法------"); 92 93 m = clazz3.getMethod("show1", String.class); 94 m.invoke(obj,"chenkaixin12121"); //公共String參數的show1():stuName=chenkaixin12121 95 96 System.out.println("------私有有參方法------"); 97 98 m = clazz3.getDeclaredMethod("show5", int.class); 99 m.setAccessible(true); //解除私有限定 100 Object o = m.invoke(obj,12121); //私有的 並且有返回值的,int參數的show4():age=12121 101 System.out.println(o); //12121abc 102 103 System.out.println("------獲取所有屬性------"); 104 105 Field[] fields = clazz3.getDeclaredFields(); 106 for(Field f : fields){ 107 // private int com.test.Student.stuNum 108 // private java.lang.String com.test.Student.stuName 109 // private java.lang.String com.test.Student.stuClass 110 System.out.println(f); 111 } 112 113 System.out.println("------設置屬性值------"); 114 115 Field field = clazz3.getDeclaredField("stuName"); 116 field.setAccessible(true); 117 Student stu2 = new Student(); 118 field.set(stu2, "chenkaixin12121"); 119 System.out.println(stu2); //Student [stuNum=0, stuName=chenkaixin12121, stuClass=null] 120 121 System.out.println("------獲取屬性值------"); 122 123 String value = field.get(stu2).toString(); 124 System.out.println(value); //chenkaixin12121 125 } 126 }