大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java反射機制實例詳解

Java反射機制實例詳解

更新時間:2019-08-15 11:13:14 來源:動力節點 瀏覽2388次



本文主要介紹了Java 反射機制實例詳解的相關資料,這里對java中反射機制進行了詳細的分析,希望對各位學員有幫助。



一、JAVA是動態語言嗎?


一般而言,說到動態言,都是指在程序運行時允許改變程序結構或者變量類型,從這個觀點看,Java和C++一樣,都不是動態語言。


但JAVA它卻有著一個非常突出的動態相關機制:反射。通過反射,Java可以于運行時加載、探知和使用編譯期間完全求和的類、生成其對象實體,調用其方法或者對屬性設值。所以Java算是一個半動態的語言吧。


反射的概念:


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


對于任意一個對象,都能夠調用它的任意一個方法;


這種動態獲取信息以及動態調用對象方法的功能稱為Java語言的反射機制



二、動態性質


1、動態性質


運行時生成對象實例;


運行期間調用方法;


運行時更改屬性



2、Java反射機制能實現的功能


在運行時判斷任意一個對象所屬的類


在運行時構造任意一個類的對象


在運行時判斷任意懷個類所具有的方法和屬性


在運行時調用任意一個對象的方法


生成動態代理



3、Java反射應用場合


在Java程序中許多對象在運行時都會出現兩種類型:編譯時類型和運行時類型


編譯時的類型由聲明該對象時使用的類型決定,運行時的類型由實際賦給對象的類型決定


如:


Person p =new Student();


編譯時類型為Person,而運行時為Student



除此之外,程序在運行時還可能接收到外部傳入的一個對象,該對象的編譯時類型為Object,但程序又需要調用該對象運行時類型的方法。為了這些問題程序需要在運行時發現對象和類的真實信息。然而,如果編譯時根本無法預知該對象和類可能屬于哪些類,程序只依靠運行時信息來發現該對象和類的真實信息,此時就必須使用反射。



三、Java反射API


反射API用來生成在當前JAVA虛擬機中的類、接口或者對象的信息。


Class類:反射的核心類,可以獲取類的屬性,方法等內容信息。


Field類:Java.lang.reflect.表示類的屬性,可以獲取和設置類的中屬性值。


Method類:Java.lang.reflect。表示類的方法,它可以用來獲取類中方法的信息或者執行方法


Construcor類:Java.lang.reflect。表示類的構造方法。



四、獲取全部方法和屬性


Person類


package com.pb.Reflect.classinfo;

 

public class Person {

  private String name;

  private String gender;

  private int age;

 

  private Person() {

  //

  }

  public Person(String name, String gender, int age) {

    super();

    this.name = name;

    this.gender = gender;

    this.age = age;

  }

  //getter、和setter方法

  private String getName() {

    return name;

  }

  private 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+"年齡: "+age;

  }

 

}


使用反射:


package com.pb.Reflect.classinfo;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

import javax.swing.JOptionPane;

 

/*

 * 通過用戶輸入類的全路徑,來獲取該類的成員方法和屬性

 * Declared獲取全部不管是私有和公有

 * 1.獲取訪問類的Class對象

 * 2.調用Class對象的方法返回訪問類的方法和屬性信息

 */

public class ReflectDemo {

 

  /*

   * 構造方法

   */

  public ReflectDemo(){

    //用戶輸入類的全路徑徑

    //使用String組件

    String classpsth=JOptionPane.showInputDialog(null,"輸入類的全路徑");

    //使用Class.forName方法根據輸入的類的全路徑 返回該類的Class對象

    try {

      Class cla = Class.forName(classpsth);

      //利用Class對象的cla的自審,返回方法對象集合

      Method [] method=cla.getDeclaredMethods(); //返回所有的方法

      System.out.println("========獲取方法信息============");

      for (Method meth : method) {

        //遍歷method數組,并輸出方法信息

        System.out.println(meth.toString());

      }

      System.out.println("========獲取出方法信息結束============");

      //獲取屬性利用Class對象的cla的自審,返回成員屬性對象集合

       Field [] field=cla.getDeclaredFields();

        System.out.println("========獲取成員屬性信息============");

        for (Field f : field) {

          System.out.println(f.toString());

        }

        System.out.println("========獲取成員屬性信息結束============");

      //獲取屬性利用Class對象的cla的自審,返回構造方法集合

        Constructor [] constructor=cla.getDeclaredConstructors();

        System.out.println("========獲取成員構造方法信息============");

        for (Constructor constru : constructor) {

          System.out.println(constru.toString());

        }

        System.out.println("========獲取成員構造方法信息結束============");

    } catch (ClassNotFoundException e) {

      e.printStackTrace();

      System.out.println("路徑輸入錯誤!");

    }

  }

 

}


package com.pb.Reflect.classinfo;

 

public class TestReflection {

 

  public static void main(String[] args) {

    ReflectDemo rd=new ReflectDemo();

 

  }

 

}


輸入com.pb.Reflect.classinfo.Person


結果:


========獲取方法信息============

public java.lang.String com.pb.Reflect.classinfo.Person.getGender()

public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)

public int com.pb.Reflect.classinfo.Person.getAge()

public void com.pb.Reflect.classinfo.Person.setAge(int)

public java.lang.String com.pb.Reflect.classinfo.Person.toString()

private java.lang.String com.pb.Reflect.classinfo.Person.getName()

private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)

========獲取出方法信息結束============

========獲取成員屬性信息============

private java.lang.String com.pb.Reflect.classinfo.Person.name

private java.lang.String com.pb.Reflect.classinfo.Person.gender

private int com.pb.Reflect.classinfo.Person.age

========獲取成員屬性信息結束============

========獲取構造方法信息============

private com.pb.Reflect.classinfo.Person()

public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)

========獲取構造方法信息結束============



五、使用反射的步驟


1、步驟


Java.lang.reflect


獲得想操作類的Java.lang.Class對象


調用Class的方法


使用反射API來操作這些信息 



2、獲取Class對象方式


調用某個對象的getClass()方法


Person p = new Person();

Class cla=p.getClass();


調用某個類的class屬性來獲取該類對應的Class對象


Class cls=Person.class;


使用Class類的forName()靜態方法


Class cla=Class.forName(“類的全路徑”);



 六、第二種方式對象的getClass()方法


Person類,因為要聲明對象所以將構造方法public


package com.pb.Reflect.classinfo;

 

public class Person {

  private String name;

  private String gender;

  private int age;

 

  public Person() {

  //

  }

  public Person(String name, String gender, int age) {

    super();

    this.name = name;

    this.gender = gender;

    this.age = age;

  }

  //getter、和setter方法

  private String getName() {

    return name;

  }

  private 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+"年齡: "+age;

  }

 

}


使用反射:


package com.pb.Reflect.classinfo;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

import javax.swing.JOptionPane;

 

/*

 * 通過用戶輸入類的全路徑,來獲取該類的成員方法和屬性

 * Declared獲取全部不管是私有和公有

 * 1.獲取訪問類的Class對象

 * 2.調用Class對象的方法返回訪問類的方法和屬性信息

 */

 

  public ReflectDemo(Person p){

    Class cla=p.getClass();

    //利用Class對象的cla的自審,返回方法對象集合

    Method [] method=cla.getDeclaredMethods(); //返回所有的方法

    System.out.println("========獲取方法信息============");

    for (Method meth : method) {

      //遍歷method數組,并輸出方法信息

      System.out.println(meth.toString());

    }

    System.out.println("========獲取出方法信息結束============");

    //獲取屬性利用Class對象的cla的自審,返回成員屬性對象集合

     Field [] field=cla.getDeclaredFields();

      System.out.println("========獲取成員屬性信息============");

      for (Field f : field) {

        System.out.println(f.toString());

      }

      System.out.println("========獲取成員屬性信息結束============");

    //獲取屬性利用Class對象的cla的自審,返回構造方法集合

      Constructor [] constructor=cla.getDeclaredConstructors();

      System.out.println("========獲取成員構造方法信息============");

      for (Constructor constru : constructor) {

        System.out.println(constru.toString());

      }

      System.out.println("========獲取成員構造方法信息結束============");

  }

 

}

測試類


package com.pb.Reflect.classinfo;

 

public class TestReflection {

 

  public static void main(String[] args) {

    Person p=new Person();

    ReflectDemo rd=new ReflectDemo(p);

 

  }

 


========獲取方法信息============

public java.lang.String com.pb.Reflect.classinfo.Person.getGender()

public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)

public int com.pb.Reflect.classinfo.Person.getAge()

public void com.pb.Reflect.classinfo.Person.setAge(int)

public java.lang.String com.pb.Reflect.classinfo.Person.toString()

private java.lang.String com.pb.Reflect.classinfo.Person.getName()

private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)

========獲取出方法信息結束============

========獲取成員屬性信息============

private java.lang.String com.pb.Reflect.classinfo.Person.name

private java.lang.String com.pb.Reflect.classinfo.Person.gender

private int com.pb.Reflect.classinfo.Person.age

========獲取成員屬性信息結束============

========獲取成員構造方法信息============

public com.pb.Reflect.classinfo.Person()

public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)

========獲取成員構造方法信息結束============



七、第三種方法類的.class屬性


Person類同上


測試類:


package com.pb.Reflect.classinfo;

 

import java.lang.reflect.Constructor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

 

public class TestReflection {

 

  public static void main(String[] args) {

    /*第二種方法

    Person p=new Person();

    ReflectDemo rd=new ReflectDemo(p);

*/

 

    /*

     * 第三種方式.class屬性

     */

    Class cla=Person.class;

    //利用Class對象的cla的自審,返回方法對象集合

        Method [] method=cla.getDeclaredMethods(); //返回所有的方法

        System.out.println("========獲取方法信息============");

        for (Method meth : method) {

          //遍歷method數組,并輸出方法信息

          System.out.println(meth.toString());

        }

        System.out.println("========獲取出方法信息結束============");

        //獲取屬性利用Class對象的cla的自審,返回成員屬性對象集合

         Field [] field=cla.getDeclaredFields();

          System.out.println("========獲取成員屬性信息============");

          for (Field f : field) {

            System.out.println(f.toString());

          }

          System.out.println("========獲取成員屬性信息結束============");

        //獲取屬性利用Class對象的cla的自審,返回構造方法集合

          Constructor [] constructor=cla.getDeclaredConstructors();

          System.out.println("========獲取成員構造方法信息============");

          for (Constructor constru : constructor) {

            System.out.println(constru.toString());

          }

          System.out.println("========獲取成員構造方法信息結束============");

  }

 

}

結果:


同上


========獲取方法信息============

public java.lang.String com.pb.Reflect.classinfo.Person.getGender()

public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)

public int com.pb.Reflect.classinfo.Person.getAge()

public void com.pb.Reflect.classinfo.Person.setAge(int)

public java.lang.String com.pb.Reflect.classinfo.Person.toString()

private java.lang.String com.pb.Reflect.classinfo.Person.getName()

private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)

========獲取出方法信息結束============

========獲取成員屬性信息============

private java.lang.String com.pb.Reflect.classinfo.Person.name

private java.lang.String com.pb.Reflect.classinfo.Person.gender

private int com.pb.Reflect.classinfo.Person.age

========獲取成員屬性信息結束============

========獲取成員構造方法信息============

public com.pb.Reflect.classinfo.Person()

public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)

========獲取成員構造方法信息結束============


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 欧美猛妇色xxxxxbbbb | 国产情侣偷国语对白 | 午夜影院一区二区 | 五月久久亚洲七七综合中文网 | 免费国产高清精品一区在线 | 99这里只有 | 99在线国产 | 国产精品拍自在线观看 | 欧美另类丰满69xxxxx | 成年午夜视频免费观看视频 | 99久久综合久中文字幕 | 亚洲人成在线观看 | 亚洲精品911 | 一级片短视频 | 狠狠操夜夜操 | 亚洲国产精品悠悠久久琪琪 | 欧美中文字幕在线看 | 欧美成人午夜做爰视频在线观看 | 久操国产| 午夜剧场毛片 | 男女啪啪猛烈免费网站 | 国产一区二区久久精品 | 99热最新网站地址获取 | 久久久最新精品 | 久久99国产亚洲高清观看韩国 | 手机在线看片国产日韩生活片 | 久青草免费视频 | 午夜亚洲| 国产精品一区二区在线播放 | 日本操操操| 99久久精品无码一区二区毛片 | 日韩高清欧美精品亚洲 | 国产欧美一区二区三区视频 | 中文字幕 二区 三区 搜查官 | 人人干人 | 精品国产第一国产综合精品 | 亚洲精品69 | 久久精品国产亚洲麻豆 | 免费人成激情视频在线看 | 日日噜噜夜夜狠狠久久aⅴ 日日噜噜夜夜狠狠久久丁香 | 日本美女久久 |