1. 程式人生 > >Java 反射和對映(主要描述下反射)

Java 反射和對映(主要描述下反射)

什麼是反射?等同於對映嗎?

    完全不相關的。反射是一個機機制,對映是一種關係。

       反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。

    對映是一種對應關係,在很多的情況下,表示一種存在的聯絡而已。

反射能做什麼

  • 在執行時判斷任意一個物件所屬的類;

  • 在執行時構造任意一個類的物件;

  • 在執行時判斷任意一個類所具有的成員變數和方法;

  • 在執行時呼叫任意一個物件的方法;

  • 生成動態代理。

     通俗的講,當某些API沒有暴露出來,但是我們又需要用到其中的某些方法屬性就需要了。
ForExample: //假如JavaBean沒有暴露出構造方法 package mypackage;


public class JavaBean {


private int age;
private String name;
public  String adress;
public int getAge() {
return age;
}
private void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}

        
}
//我們可以通過Class類來獲取例項物件 package mypackage;


import java.lang.reflect.Method;


public class JNITest {
  public static native void  getStringFromC();
public static void main(String[] args) {


       try {
           //獲取類
           Class<?> class1 = Class.forName("mypackage.JavaBean");


           //獲取所有的公共的方法
           Method[] methods =  class1.getMethods() ;
           
           for (Method method : methods) {
               System.out.println( method );
           }
           //獲取例項類
           Object object  = class1.newInstance();
           JavaBean javaBean  = (JavaBean)object;
           javaBean.setName("Hellow");
           System.out.println("--->"+javaBean.getName());


          } catch (Exception e) {
           e.printStackTrace();
       }
   }


} 執行結果:
public java.lang.String mypackage.JavaBean.getName()
public void mypackage.JavaBean.setName(java.lang.String)
public java.lang.String mypackage.JavaBean.getAdress()
public void mypackage.JavaBean.TestMethod()
public int mypackage.JavaBean.getAge()
public void mypackage.JavaBean.setAdress(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
--->Hellow