最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年09月07日 10:53:07   作者:攻城獅--晴明  
這篇文章主要介紹了Java 反射機(jī)制實(shí)例詳解的相關(guān)資料,這里對(duì)java中反射機(jī)制進(jìn)行了詳細(xì)的分析,需要的朋友可以參考下

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

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

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

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

反射的概念:

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

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

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

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

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

運(yùn)行時(shí)生成對(duì)象實(shí)例;
運(yùn)行期間調(diào)用方法;
運(yùn)行時(shí)更改屬性

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

在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類(lèi)
在運(yùn)行時(shí)構(gòu)造任意一個(gè)類(lèi)的對(duì)象
在運(yùn)行時(shí)判斷任意懷個(gè)類(lèi)所具有的方法和屬性
在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法
生成動(dòng)態(tài)代理

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

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

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

如:

Person p =new Student();

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

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

三、Java反射API

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

Class類(lèi):反射的核心類(lèi),可以獲取類(lèi)的屬性,方法等內(nèi)容信息。
Field類(lèi):Java.lang.reflect.表示類(lèi)的屬性,可以獲取和設(shè)置類(lèi)的中屬性值。
Method類(lèi):Java.lang.reflect。表示類(lèi)的方法,它可以用來(lái)獲取類(lèi)中方法的信息或者執(zhí)行方法
Construcor類(lèi):Java.lang.reflect。表示類(lèi)的構(gòu)造方法。

四、獲取全部方法和屬性

Person類(lèi)

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;

/*
 * 通過(guò)用戶輸入類(lèi)的全路徑,來(lái)獲取該類(lèi)的成員方法和屬性
 * Declared獲取全部不管是私有和公有
 * 1.獲取訪問(wèn)類(lèi)的Class對(duì)象
 * 2.調(diào)用Class對(duì)象的方法返回訪問(wèn)類(lèi)的方法和屬性信息
 */
public class ReflectDemo {

  /*
   * 構(gòu)造方法
   */
  public ReflectDemo(){
    //用戶輸入類(lèi)的全路徑徑
    //使用String組件
    String classpsth=JOptionPane.showInputDialog(null,"輸入類(lèi)的全路徑");
    //使用Class.forName方法根據(jù)輸入的類(lèi)的全路徑 返回該類(lèi)的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é)束============

五、使用反射的步驟

5.1、步驟

Java.lang.reflect

獲得想操作類(lèi)的Java.lang.Class對(duì)象
調(diào)用Class的方法
使用反射API來(lái)操作這些信息 

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

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

Person p = new Person();
Class cla=p.getClass();

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

Class cls=Person.class;

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

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

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

Person類(lèi),因?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;

/*
 * 通過(guò)用戶輸入類(lèi)的全路徑,來(lái)獲取該類(lèi)的成員方法和屬性
 * Declared獲取全部不管是私有和公有
 * 1.獲取訪問(wèn)類(lèi)的Class對(duì)象
 * 2.調(diào)用Class對(duì)象的方法返回訪問(wèn)類(lèi)的方法和屬性信息
 */

  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è)試類(lèi)

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é)束============

七、第三種方法類(lèi)的.class屬性

Person類(lèi)同上

測(cè)試類(lèi):

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對(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é)束============

如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Java全面細(xì)致講解==和equals的使用

    Java全面細(xì)致講解==和equals的使用

    這篇文章主要介紹了Java中==和equals()的區(qū)別,,==可以使用在基本數(shù)據(jù)類(lèi)型變量和引用數(shù)據(jù)類(lèi)型變量中,equals()是方法,只能用于引用數(shù)據(jù)類(lèi)型,需要的朋友可以參考下
    2022-05-05
  • 聊聊spring boot的WebFluxTagsProvider的使用

    聊聊spring boot的WebFluxTagsProvider的使用

    這篇文章主要介紹了聊聊spring boot的WebFluxTagsProvider的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Java 泛型有哪些好處詳解

    Java 泛型有哪些好處詳解

    這篇文章主要介紹了 Java 泛型有哪些好處詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java Matcher匹配頭尾截取替換字符串的案例

    java Matcher匹配頭尾截取替換字符串的案例

    這篇文章主要介紹了java Matcher匹配頭尾截取替換字符串的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Java面試必備之JMM高并發(fā)編程詳解

    Java面試必備之JMM高并發(fā)編程詳解

    高并發(fā)(High?Cuncurrency)是互聯(lián)網(wǎng)分布式系統(tǒng)架構(gòu)設(shè)計(jì)中必須考慮的因素之一,它通常是指,通過(guò)設(shè)計(jì)保證系統(tǒng)能夠同時(shí)并發(fā)處理很多請(qǐng)求
    2022-07-07
  • Java多線程(單例模式,阻塞隊(duì)列,定時(shí)器,線程池)詳解

    Java多線程(單例模式,阻塞隊(duì)列,定時(shí)器,線程池)詳解

    本文是多線程初級(jí)入門(mén),主要介紹了多線程單例模式、阻塞隊(duì)列、定時(shí)器、線程池、多線程面試考點(diǎn),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-09-09
  • 淺談Hibernate n+1問(wèn)題

    淺談Hibernate n+1問(wèn)題

    這篇文章主要介紹了淺談Hibernate n+1問(wèn)題,怎么解決n+1問(wèn)題,文中也作了簡(jiǎn)要分析,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Java實(shí)現(xiàn)的迷宮游戲

    Java實(shí)現(xiàn)的迷宮游戲

    這篇文章主要介紹了如何用Java實(shí)現(xiàn)一個(gè)迷宮游戲,本倉(cāng)庫(kù)代碼是經(jīng)過(guò)eclipse編譯運(yùn)行過(guò)的,一般情況下將本倉(cāng)庫(kù)代碼下載下來(lái)之后,使用eclipse編譯直接可以運(yùn)行。
    2021-04-04
  • SpringBoot WebService服務(wù)端&客戶端使用案例教程

    SpringBoot WebService服務(wù)端&客戶端使用案例教程

    這篇文章主要介紹了SpringBoot WebService服務(wù)端&客戶端使用案例教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-10-10
  • Java中Scanner用法實(shí)例解析

    Java中Scanner用法實(shí)例解析

    Scanner?指的是java.util包下的Scanner類(lèi),可以接收控制臺(tái)輸入的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中Scanner用法實(shí)例的相關(guān)資料,文中通過(guò)實(shí)例代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11

最新評(píng)論

科技| 萍乡市| 牡丹江市| 明溪县| 龙川县| 汉源县| 抚州市| 包头市| 巫山县| 昌平区| 安阳县| 普格县| 镇原县| 云霄县| 革吉县| 柳河县| 西充县| 通榆县| 南开区| 屏山县| 呼和浩特市| 巢湖市| 吉林市| 淮阳县| 南靖县| 盐亭县| 嘉黎县| 德安县| 额济纳旗| 普兰店市| 陆川县| 南华县| 广灵县| 团风县| 衡阳县| 平邑县| 台南市| 嵊州市| 祁阳县| 白城市| 侯马市|