Java反射機(jī)制實(shí)例詳解

Java反射機(jī)制實(shí)例詳解

長(zhǎng)沙一度軟件培訓(xùn)      2022-04-28 15:56:01     15

Java反射機(jī)制實(shí)例詳解,本文主要介紹了Java 反射機(jī)制實(shí)例詳解的相關(guān)資料,這里對(duì)java中反射機(jī)制進(jìn)行了詳細(xì)的分析,希望對(duì)各位學(xué)員有幫助。一、JAVA是動(dòng)態(tài)

課程價(jià)格 請(qǐng)咨詢

上課時(shí)段: 授課校區(qū):

詳細(xì)介紹



本文主要介紹了Java 反射機(jī)制實(shí)例詳解的相關(guān)資料,這里對(duì)java中反射機(jī)制進(jìn)行了詳細(xì)的分析,希望對(duì)各位學(xué)員有幫助。



一、JAVA是動(dòng)態(tài)語言嗎?


一般而言,說到動(dòng)態(tài)言,都是指在程序運(yùn)行時(shí)允許改變程序結(jié)構(gòu)或者變量類型,從這個(gè)觀點(diǎn)看,Java和C++一樣,都不是動(dòng)態(tài)語言。


但JAVA它卻有著一個(gè)非常突出的動(dòng)態(tài)相關(guān)機(jī)制:反射。通過反射,Java可以于運(yùn)行時(shí)加載、探知和使用編譯期間完全求和的類、生成其對(duì)象實(shí)體,調(diào)用其方法或者對(duì)屬性設(shè)值。所以Java算是一個(gè)半動(dòng)態(tài)的語言吧。


反射的概念:


在Java中的反射機(jī)制是指在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;


對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法;


這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為Java語言的反射機(jī)制



二、動(dòng)態(tài)性質(zhì)


1、動(dòng)態(tài)性質(zhì)


運(yùn)行時(shí)生成對(duì)象實(shí)例;


運(yùn)行期間調(diào)用方法;


運(yùn)行時(shí)更改屬性



2、Java反射機(jī)制能實(shí)現(xiàn)的功能


在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類


在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象


在運(yùn)行時(shí)判斷任意懷個(gè)類所具有的方法和屬性


在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法


生成動(dòng)態(tài)代理



3、Java反射應(yīng)用場(chǎng)合


在Java程序中許多對(duì)象在運(yùn)行時(shí)都會(huì)出現(xiàn)兩種類型:編譯時(shí)類型和運(yùn)行時(shí)類型


編譯時(shí)的類型由聲明該對(duì)象時(shí)使用的類型決定,運(yùn)行時(shí)的類型由實(shí)際賦給對(duì)象的類型決定


如:


Person p =new Student();


編譯時(shí)類型為Person,而運(yùn)行時(shí)為Student



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



三、Java反射API


反射API用來生成在當(dāng)前JAVA虛擬機(jī)中的類、接口或者對(duì)象的信息。


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


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


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


Construcor類:Java.lang.reflect。表示類的構(gòu)造方法。



四、獲取全部方法和屬性


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;

 

public class ReflectDemo {

 

 

  public ReflectDemo(){

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

    //使用String組件

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

    //使用Class.forName方法根據(jù)輸入的類的全路徑 返回該類的Class對(duì)象

    try {

      Class cla = Class.forName(classpsth);

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

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

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

      for (Method meth : method) {

        //遍歷method數(shù)組,并輸出方法信息

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

      }

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

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

       Field [] field=cla.getDeclaredFields();

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

        for (Field f : field) {

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

        }

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

      //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合

        Constructor [] constructor=cla.getDeclaredConstructors();

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

        for (Constructor constru : constructor) {

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

        }

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

    } catch (ClassNotFoundException e) {

      e.printStackTrace();

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

    }

  }

 

}


package com.pb.Reflect.classinfo;

 

public class TestReflection {

 

  public static void main(String[] args) {

    ReflectDemo rd=new ReflectDemo();

 

  }

 

}


輸入com.pb.Reflect.classinfo.Person


結(jié)果:


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

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)

========獲取出方法信息結(jié)束============

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

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

========獲取成員屬性信息結(jié)束============

========獲取構(gòu)造方法信息============

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

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

========獲取構(gòu)造方法信息結(jié)束============



五、使用反射的步驟


1、步驟


Java.lang.reflect


獲得想操作類的Java.lang.Class對(duì)象


調(diào)用Class的方法


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



2、獲取Class對(duì)象方式


調(diào)用某個(gè)對(duì)象的getClass()方法


Person p = new Person();

Class cla=p.getClass();


調(diào)用某個(gè)類的class屬性來獲取該類對(duì)應(yīng)的Class對(duì)象


Class cls=Person.class;


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


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



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


Person類,因?yàn)橐暶鲗?duì)象所以將構(gòu)造方法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;

 

 

  public ReflectDemo(Person p){

    Class cla=p.getClass();

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

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

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

    for (Method meth : method) {

      //遍歷method數(shù)組,并輸出方法信息

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

    }

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

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

     Field [] field=cla.getDeclaredFields();

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

      for (Field f : field) {

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

      }

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

    //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合

      Constructor [] constructor=cla.getDeclaredConstructors();

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

      for (Constructor constru : constructor) {

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

      }

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

  }

 

}

測(cè)試類


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)

========獲取出方法信息結(jié)束============

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

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

========獲取成員屬性信息結(jié)束============

========獲取成員構(gòu)造方法信息============

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

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

========獲取成員構(gòu)造方法信息結(jié)束============



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


Person類同上


測(cè)試類:


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) {

   

 

   

    Class cla=Person.class;

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

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

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

        for (Method meth : method) {

          //遍歷method數(shù)組,并輸出方法信息

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

        }

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

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

         Field [] field=cla.getDeclaredFields();

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

          for (Field f : field) {

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

          }

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

        //獲取屬性利用Class對(duì)象的cla的自審,返回構(gòu)造方法集合

          Constructor [] constructor=cla.getDeclaredConstructors();

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

          for (Constructor constru : constructor) {

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

          }

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

  }

 

}

結(jié)果:


同上


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

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)

========獲取出方法信息結(jié)束============

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

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

========獲取成員屬性信息結(jié)束============

========獲取成員構(gòu)造方法信息============

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

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

========獲取成員構(gòu)造方法信息結(jié)束============


培訓(xùn)啦提醒您:交易時(shí)請(qǐng)核實(shí)對(duì)方資質(zhì),對(duì)于過大宣傳或承諾需謹(jǐn)慎!任何要求預(yù)付定金、匯款等方式均存在風(fēng)險(xiǎn),謹(jǐn)防上當(dāng)。