欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java 反射機制知識詳細介紹及總結(jié)

 更新時間:2017年01月12日 09:06:24   投稿:lqh  
反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制

本篇將從以下幾個方面講述反射的知識:

  • class 的使用
  • 方法的反射
  • 構(gòu)造函數(shù)的反射
  • 成員變量的反射

一、什么是class類

在面向?qū)ο蟮氖澜缋?,萬物皆對象。類是對象,類是java.lang.Class類的實例對象。另外class類只有java虛擬機才能new出來。任何一個類都是Class 類的實例對象。這實例對象有三種表達方式:

public class User{
}

public class ClassTest{
User u=new User();
 //方式1:
 Class c1=User.class;
//方式2:
Class c2=u.getClass();
//方式3:
Class c3=Class.forName("com.forezp.User");

//可以通過類的類型創(chuàng)建該類的實例對象
User user=(User)c1.newInstance();
}

二、class類的動態(tài)加載

Class.forName(類的全稱);該方法不僅表示了類的類型,還代表了動態(tài)加載類。編譯時刻加載類是靜態(tài)加載、運行時刻加載類是動態(tài)加載類。

三、獲取方法信息

基本的數(shù)據(jù)類型,void關(guān)鍵字都Class 類的實例;可以通過getame();getSimpleName()獲取類的名稱。

Class c1=String.class;
Class c2=int.class;
Class c3=void.class;
System.out.println(c1.getName());
System.out.println(c2.getSimpleName());

獲取類的所有方法,并打印出來:

public static void printClassInfo(Object object){
    Class c=object.getClass();
    System.out.println("類的名稱:"+c.getName());

    /**
     * 一個成員方法就是一個method對象
     * getMethod()所有的 public方法,包括父類繼承的 public
     * getDeclaredMethods()獲取該類所有的方法,包括private ,但不包括繼承的方法。
     */
    Method[] methods=c.getMethods();//獲取方法
    //獲取所以的方法,包括private ,c.getDeclaredMethods();

    for(int i=0;i<methods.length;i++){
      //得到方法的返回類型
      Class returnType=methods[i].getReturnType();
      System.out.print(returnType.getName());
      //得到方法名:
      System.out.print(methods[i].getName()+"(");

      Class[] parameterTypes=methods[i].getParameterTypes();
      for(Class class1:parameterTypes){
        System.out.print(class1.getName()+",");
      }
      System.out.println(")");
    }
  }

運行:

類的名稱:java.lang.String
booleanequals(java.lang.Object,)
java.lang.StringtoString()
inthashCode()
…

四、獲取成員變量的信息

也可以獲取類的成員變量信息

 public static void printFiledInfo(Object o){

    Class c=o.getClass();
    /**
     * getFileds()獲取public
     * getDeclaredFields()獲取所有
     */
    Field[] fileds=c.getDeclaredFields();

    for(Field f:fileds){
      //獲取成員變量的類型
      Class filedType=f.getType();
      System.out.println(filedType.getName()+" "+f.getName());
    }

  }

public static void main(String[] args){
        String s="ss";
        //ClassUtil.printClassInfo(s);
        ClassUtil.printFiledInfo(s);
    }

運行:

[C value
int hash
long serialVersionUID
[Ljava.io.ObjectStreamField; serialPersistentFields
java.util.Comparator CASE_INSENSITIVE_ORDER
int HASHING_SEED
int hash32

五、獲取構(gòu)造函數(shù)的信息

public static void printConstructInfo(Object o){
    Class c=o.getClass();

    Constructor[] constructors=c.getDeclaredConstructors();
    for (Constructor con:constructors){
      System.out.print(con.getName()+”(“);

      Class[] typeParas=con.getParameterTypes();
      for (Class class1:typeParas){
        System.out.print(class1.getName()+” ,”);
      }
      System.out.println(“)”);
    }
  }

 public static void main(String[] args){
        String s="ss";
        //ClassUtil.printClassInfo(s);
        //ClassUtil.printFiledInfo(s);
        ClassUtil.printConstructInfo(s);
    }

運行:

java.lang.String([B ,)
java.lang.String([B ,int ,int ,)
java.lang.String([B ,java.nio.charset.Charset ,)
java.lang.String([B ,java.lang.String ,)
java.lang.String([B ,int ,int ,java.nio.charset.Charset ,)
java.lang.String(int ,int ,[C ,)
java.lang.String([C ,boolean ,)
java.lang.String(java.lang.StringBuilder ,)
java.lang.String(java.lang.StringBuffer ,)
...

六、方法反射的操作

獲取一個方法:需要獲取方法的名稱和方法的參數(shù)才能決定一個方法。

方法的反射操作:

method.invoke(對象,參數(shù)列表);

舉個例子:

class A{

  public void add(int a,int b){
    System.out.print(a+b);
  }

  public void toUpper(String a){
    System.out.print(a.toUpperCase());
  }
}

public static void main(String[] args) {
    A a=new A();
    Class c=a.getClass();
    try {
      Method method=c.getMethod("add",new Class[]{int.class,int.class});
      //也可以 Method method=c.getMethod("add",int.class,int.class);
      //方法的反射操作
      method.invoke(a,10,10);
    }catch (Exception e){
      e.printStackTrace();
    }
  }

運行:

20

本篇文章已經(jīng)講解了java反射的基本用法, 它可以在運行時判斷任意一個對象所屬的類;在運行時構(gòu)造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調(diào)用任意一個對象的方法;生成動態(tài)代理。

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • java類的定義與使用舉例詳解

    java類的定義與使用舉例詳解

    這篇文章主要給大家介紹了關(guān)于java類的定義與使用的相關(guān)資料,類的方法是用來定義類的行為,在方法中通過操作類的成員變量、編寫業(yè)務(wù)邏輯、返回 結(jié)果等實現(xiàn)類的業(yè)務(wù)行為,需要的朋友可以參考下
    2023-11-11
  • 基于String實現(xiàn)同步鎖的方法步驟

    基于String實現(xiàn)同步鎖的方法步驟

    這篇文章主要給大家介紹了關(guān)于基于String實現(xiàn)同步鎖的方法步驟,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用String具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java的finalize方法解讀

    java的finalize方法解讀

    這篇文章主要介紹了java的finalize方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java中i=i++和j=i++的區(qū)別小結(jié)

    java中i=i++和j=i++的區(qū)別小結(jié)

    這篇文章主要給大家介紹了關(guān)于java中i=i++和j=i++區(qū)別的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 簡單了解Java程序運行整體流程

    簡單了解Java程序運行整體流程

    這篇文章主要介紹了簡單了解Java程序運行整體流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java拷貝文件夾和刪除文件夾代碼實例

    Java拷貝文件夾和刪除文件夾代碼實例

    這篇文章主要介紹了Java拷貝文件夾和刪除文件夾代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 詳解Java8函數(shù)式編程之收集器的應(yīng)用

    詳解Java8函數(shù)式編程之收集器的應(yīng)用

    這篇文章主要介紹了詳解Java8函數(shù)式編程之收集器的應(yīng)用,收集器是一種通用的、從流生成復(fù)雜值的結(jié)構(gòu)??梢允褂盟鼜牧髦猩蒐ist、Set、Map等集合,需要的朋友可以參考下
    2023-04-04
  • 詳解Java的MyBatis框架與Spring框架整合中的映射器注入

    詳解Java的MyBatis框架與Spring框架整合中的映射器注入

    映射器注入方式可以將MyBatis與Spring映射好的XML文件實現(xiàn)配置共用,這里我們就來詳解Java的MyBatis框架與Spring框架整合中的映射器注入:
    2016-06-06
  • Java 多線程的同步代碼塊詳解

    Java 多線程的同步代碼塊詳解

    這篇文章主要介紹了Java 多線程的同步代碼塊,使用synchronized關(guān)鍵字創(chuàng)建線程同步方法是實現(xiàn)線程同步的關(guān)鍵,需要的朋友可以參考下
    2021-10-10
  • 解決SpringBoot啟動過后不能訪問jsp頁面的問題(超詳細)

    解決SpringBoot啟動過后不能訪問jsp頁面的問題(超詳細)

    這篇文章主要介紹了解決SpringBoot啟動過后不能訪問jsp頁面的問題,文中通過示例代碼介紹的非常詳細,有需要的朋友可以參考一下,希望對你有所幫助。
    2020-05-05

最新評論