什麼是java 反射以及如何使用反射

什麼是java 反射以及如何使用反射

最近在學spring框架也難免要接觸反射,因此在這裏簡單介紹一下反射並且也相應的當作複習了

1.反射的作用?
大家在開發中可能會遇到這種情況:有時想要獲取一個類中的成員變量但發現它是私有的,或者有時想要調用一個對象的私有方法卻發現用一般方法難以實現,又或是想要打印一個類中的所有方法名或者變量名卻發現束手無策時這時候就是反射發揮其作用的時候了。

2.反射的定義?
用別人的話來說,反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制
用自己的話來說,反射是指在運行時(編譯後的文件在java虛擬機上運行時)而不是編譯時調用一個類的所有方法或屬性的機制。

3.如何使用反射?(使用時記得導reflect包)
Student.class

public class Student {
	private int id;
 	public String name;
	private String gender;
 	private int age;
 	private int times;
 	public Student() {
 	}
 	public Student(int id,String name,String gender,int age,int times){
  		this.id = id;
 		this.name= name;
  		this.gender= gender;
  		this.age = age;
 		this.times = times;
 	}
 	public int getId() {
  		return id;
 	}
 	private void setId(int id) {	//setter設爲private僅作爲測試使用
 		this.id = id;
 	}
 	//其它的方法

1.獲取類的信息
方式一:

Class<?> cls = Class.forName(String className);//這裏用了泛型但如果確認了類的類型就可以指定類型

方式二

Class<Student> cls = Student.class

方式三

Student s = new Student();
Class<?> cls = s.getClass();//getClass()返回的是Object類

2.獲取構造方法

Class<Student> cls = Student.class;//使用第二種方式獲取類的信息
Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);//獲取帶參數的構造方法
Constructor<?> c1 = cls.getConstructor();//獲取不帶參數的構造方法
Constructor<?>[] c2 = c.getConstructors();//獲取所有構造方法

3.根據構造方法獲取實例(注意: newInstance方法返回的是Object類所以如果要用其它的類接收則必須強轉)

Class<Student> cls = Student.class;//使用第二種方式獲取類的信息
Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);//先獲取帶參數的構造方法
Object o = c0.newInstance(1,"zygswo","男",1,1);//根據構造方法獲取實例
Object o = cls.newInstance();//調用默認無參構造方法

4.獲取成員變量

Class<Student> cls = Student.class;//使用第二種方式獲取類的信息
Field f0 = cls.getDeclaredField("age");//獲取當前類中定義的成員變量age(包括不可見的)
Field f1 = cls.getField("name");//獲取當前類中可見的成員變量name(包括從父類中繼承的成員變量)
Field[] f2 = cls.getDeclaredFields();//獲取當前類中所有定義的成員變量(包括不可見的)
Field[] f3 = cls.getFields();//獲取當前類中所有可見的成員變量(包括從父類中繼承的成員變量)

5.獲取方法

Class<Student> cls = Student.class;//使用第二種方式獲取類的信息
Method m0 = cls.getDeclaredMethod("setId",int.class);//獲取當前類中定義的方法setId(包括不可見的)由於有參數所以要傳參數列表
Method m1 = cls.getMethod("getId");//獲取當前類中可見的方法getId(包括重寫的方法),由於有參數所以要傳參
Method[] m2 = cls.getDeclaredMethods();//獲取當前類中所有定義的方法(包括不可見的)
Method[] m3 = cls.getMethods();//獲取當前類中所有可見的方法(包括重寫的方法)

6.方法的調用

Class<Student> cls = Student.class;//獲取類的信息

Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);
Object o = c0.newInstance(1,"zygswo","男",1,1);//獲取實例

Method m = cls.getDeclaredMethod("setId",int.class);//獲取方法

f0.setAccessible(true);//通過該方法來獲取訪問權限
f0.invoke(o,10); //調用方法

7.屬性的賦值

Class<Student> cls = Student.class;//獲取類的信息

Constructor<?> c0 = cls.getConstructor(int.class,String.class,String.class,int.class,int.class);
Object o = c0.newInstance(1,"zygswo","男",1,1);//獲取實例

Field f = cls.getDeclaredField("id");//獲取屬性
f.setAccessible(true);//通過該方法來獲取訪問權限
f.set(o,12);//賦值	

8.其它
獲取所有方法的名字和參數類型

  Method[] a = c.getDeclaredMethods();
  for (Method f : a) {
	   //獲取類名
	   String n = f.getName();
	   //獲取參數類型
	   Class<?>[] p = f.getParameterTypes();
	   System.out.println(n + "(" + Arrays.toString(p) + ")")  
  }

獲取成員變量的信息

  Field[] a = c.getDeclaredFields();
  for (Field f : a) {
	   //獲取類型的名字
	   String t = f.getType().getSimpleName();
	   //獲取成員變量名字
	   String n = f.getName(); 
	   System.out.println(t+" "+ n);  
  }

——————————————結束語———————————————
有什麼問題可以在評論區評論哦

發佈了5 篇原創文章 · 獲贊 4 · 訪問量 4541
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章