反射機制是Java動態性之一,而說到動態性首先得了解動態語言。那麼何爲動態語言?java
動態語言,是指程序在運行時能夠改變其結構:新的函數能夠引進,已有的函數能夠被刪除等結構上的變化。好比常見的JavaScript就是動態語言,除此以外Ruby,Python等也屬於動態語言,而C、C++則不屬於動態語言。安全
從動態語言能在運行時改變程序結構結構或則變量類型上看,Java和C、C++同樣都不屬於動態語言。
可是JAVA卻又一個很是突出的與動態相關的機制:反射機制。Java經過反射機制,能夠在程序運行時加載,探知和使用編譯期間徹底未知的類,而且能夠生成相關類對象實例,從而能夠調用其方法或則改變某個屬性值。因此JAVA也能夠算得上是一個半動態的語言。函數
1.反射機制概念
在Java中的反射機制是指在運行狀態中,對於任意一個類都可以知道這個類全部的屬性和方法;而且對於任意一個對象,都可以調用它的任意一個方法;這種動態獲取信息以及動態調用對象方法的功能成爲Java語言的反射機制。性能
2.反射的應用場合
在Java程序中許多對象在運行是都會出現兩種類型:編譯時類型和運行時類型。
編譯時的類型由聲明對象時實用的類型來決定,運行時的類型由實際賦值給對象的類型決定
如:this
Person p=new Student();
其中編譯時類型爲Person,運行時類型爲Student。
除此以外,程序在運行時還可能接收到外部傳入的對象,該對象的編譯時類型爲Object,可是程序有須要調用該對象的運行時類型的方法。爲了解決這些問題,程序須要在運行時發現對象和類的真實信息。然而,若是編譯時根本沒法預知該對象和類屬於哪些類,程序只能依靠運行時信息來發現該對象和類的真實信息,此時就必須使用到反射了。spa
反射API用來生成JVM中的類、接口或則對象的信息。
- Class類:反射的核心類,能夠獲取類的屬性,方法等信息。
- Field類:Java.lang.reflec包中的類,表示類的成員變量,能夠用來獲取和設置類之中的屬性值。
- Method類: Java.lang.reflec包中的類,表示類的方法,它能夠用來獲取類中的方法信息或者執行方法。
- Constructor類: Java.lang.reflec包中的類,表示類的構造方法。.net
1.步驟code
2.獲取Class對象的方法對象
調用某個類的class屬性來獲取該類對應的Class對象Person p=new Person(); Class clazz=p.getClass();
使用Class類中的forName()靜態方法; (最安全/性能最好)Class clazz=Person.class;
Class clazz=Class.forName("類的全路徑"); (最經常使用)
3.獲取方法和屬性信息blog
當咱們得到了想要操做的類的Class對象後,能夠經過Class類中的方法獲取並查看該類中的方法和屬性。
示例代碼:
<<<<<<<<<<<<<<<<使用反射<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Person類<<<<<<<<<<<<<<<<<<<<<<<<<<
package reflection;
public class Person { private String name; private String gender; private int age; public Person() { } public Person(String name, String gender, int age) { this.name = name; this.gender = gender; this.age = age; } //getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "姓名:"+name+" 性別:"+gender+" 年齡:"+age; } }
package reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; /* * 經過用戶輸入類的全路徑,來獲取該類的成員方法和屬性 * Declared獲取所有無論是私有和公有 * 1.獲取訪問類的Class對象 * 2.調用Class對象的方法返回訪問類的方法和屬性信息 */ public class Test { public static void main(String[] args) { try { //獲取Person類的Class對象 Class clazz=Class.forName("reflection.Person"); //獲取Person類的全部方法信息 Method[] method=clazz.getDeclaredMethods(); for(Method m:method){ System.out.println(m.toString()); } //獲取Person類的全部成員屬性信息 Field[] field=clazz.getDeclaredFields(); for(Field f:field){ System.out.println(f.toString()); } //獲取Person類的全部構造方法信息 Constructor[] constructor=clazz.getDeclaredConstructors(); for(Constructor c:constructor){ System.out.println(c.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
輸出結果:
方法信息:
public java.lang.String reflection.Person.toString()
private java.lang.String reflection.Person.getName()
private void reflection.Person.setName(java.lang.String)
public void reflection.Person.setAge(int)
public int reflection.Person.getAge()
public java.lang.String reflection.Person.getGender()
public void reflection.Person.setGender(java.lang.String)
屬性信息:
private java.lang.String reflection.Person.name
private java.lang.String reflection.Person.gender
private int reflection.Person.age
構造方法信息
private reflection.Person()
public reflection.Person(java.lang.String,java.lang.String,int)
4.建立對象
當咱們獲取到所需類的Class對象後,能夠用它來建立對象,建立對象的方法有兩種:
示例代碼:
package reflection; import java.lang.reflect.Constructor; public class Demo01 { public static void main(String[] args) { try { //獲取Person類的Class對象 Class clazz=Class.forName("reflection.Person"); /** * 第一種方法建立對象 */ //建立對象 Person p=(Person) clazz.newInstance(); //設置屬性 p.setName("張三"); p.setAge(16); p.setGender("男"); System.out.println(p.toString()); /** * 第二種方法建立 */ //獲取構造方法 Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class); //建立對象並設置屬性 Person p1=(Person) c.newInstance("李四","男",20); System.out.println(p1.toString()); } catch (Exception e) { e.printStackTrace(); } } }
輸出結果:
姓名:張三 性別:男 年齡: 16
姓名:李四 性別:男 年齡: 20
好了,以上是Java反射機制的簡單介紹,下一篇文章我將講一下反射的兩個具體應用,經過反射操做註解和經過反射操做泛型,有興趣的同窗能夠了解一波。