反射相關的面試題


1.什么是反射

 

答:反射就是根據字節碼文件, 獲得類的信息,字段信息,方法信息等內容, 創建實例,調用方法的技

術。

 

Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個

對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態(或准動態,

為啥要說是准動態,因為一般而言的動態語言定義是程序運行時, 允許改變程序結構或變量類型,這

種語言稱為動態語言。

從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。) 語言的一個關

鍵性質。

 
2.怎么實現反射

(1)定義一個類Person:

 

package lqz2.com.cn;

public class Person {
//私有屬性
private String name = "李勤珍";
//公有屬性
public int age = 18;
//構造方法
public Person() {
super();
}

//私有方法
private void say(){
System.out.println("private say()...");
}
//公有方法
public void run(){
System.out.println("public run()...");
}

}

(2)得到 Class 的三種方式

//1、通過對象調用 getClass() 方法來獲取,通常應用在:比如你傳過來一個 Object

//  類型的對象,而不知道具體是什么類,用這種方法

  Person p1 = new Person();

  Class c1 = p1.getClass();

        

//2、直接通過 類名.class 的方式得到,該方法最為安全可靠,程序性能更高

//  這說明任何一個類都有一個隱含的靜態成員變量 class

  Class c2 = Person.class;

        

//3、通過 Class 對象的 forName() 靜態方法來獲取,用的最多,

//   但可能拋出 ClassNotFoundException 異常

  Class c3 = Class.forName("com.ys.reflex.Person");

注意:一個類在 JVM 中只會有一個 Class 實例,即我們對上面獲取的 c1,c2,c3進行 equals

比較,發現都是true。

(3)通過 Class 類獲取成員變量、成員方法、接口、超類、構造方法等。

Class 有很多方法: 

getName():獲得類的完整名字。
  getFields():獲得類的public類型的屬性。
  getDeclaredFields():獲得類的所有屬性。包括private 聲明的和繼承類
  getMethods():獲得類的public類型的方法。
  getDeclaredMethods():獲得類的所有方法。包括private 聲明的和繼承類
  getMethod(String name, Class[] parameterTypes):獲得類的特定方法,

name參數指定方法的名字,parameterTypes 參數指定方法的參數類型。
  getConstructors():獲得類的public類型的構造方法。
  getConstructor(Class[] parameterTypes):獲得類的特定構造方法,

parameterTypes 參數指定構造方法的參數類型。
  newInstance():通過類的不帶參數的構造方法創建這個類的一個對象。

 

 

3.用在什么地方

 

答:JDBC原生代碼注冊驅動,hibernate 的實體類,Spring 的 AOP等等都有反射的實現。

 

4.反射能夠做什么

答:我們知道反射機制允許程序在運行時取得任何一個已知名稱的class的內部信息,包括包括其

modifiers(修飾符),fields(屬性),methods(方法)等,並可於運行時改變fields內容或調用

methods。那么我們便可以更靈活的編寫代碼,代碼可以在運行時裝配,無需在組件之間進行源代碼

鏈接,降低代碼的耦合度;還有動態代理的實現等等;但是需要注意的是反射使用不當會造成很高的

資源消耗!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM