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

Java如何通過(guò)反射獲取Constructor、Field、Method對(duì)象

 更新時(shí)間:2022年06月09日 11:33:29   作者:遇安.112  
反射指的是對(duì)象的反向處理操作,根據(jù)對(duì)象取得對(duì)象的來(lái)源信息,在反射的世界里面,看重的不再是一個(gè)對(duì)象,而是對(duì)象身后的組成,下面這篇文章主要給大家介紹了關(guān)于Java如何通過(guò)反射獲取Constructor、Field、Method對(duì)象的相關(guān)資料,需要的朋友可以參考下

前言

在實(shí)際開發(fā)中,通過(guò)反射可以得到一個(gè)類的完整結(jié)構(gòu),包括類的構(gòu)造方法、類的屬性、類的方法,這就需要使用到j(luò)ava.lang.reflect包中的以下幾個(gè)類:

1、Constructor:表示類中的構(gòu)造方法

2、Field:表示類中的屬性

3、Method:表示類中的方法

使用反射技術(shù)獲取構(gòu)造器對(duì)象并使用

實(shí)驗(yàn)類:

public class 反射機(jī)制_2實(shí)驗(yàn)類 {
    private String name;
    private int age;
 
    private 反射機(jī)制_2實(shí)驗(yàn)類() {
        System.out.println("無(wú)參構(gòu)造器執(zhí)行!");
    }
 
    public 反射機(jī)制_2實(shí)驗(yàn)類(String name, int age) {
        System.out.println("有參構(gòu)造器執(zhí)行!");
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @Override
    public String toString() {
        return "反射機(jī)制_2實(shí)驗(yàn)類{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 獲取構(gòu)造器對(duì)象:

import org.junit.Test;
 
import java.lang.reflect.Constructor;
 
public class 反射機(jī)制_2構(gòu)造器獲取對(duì)象 {
    //1、getConstructors
    //獲取全部的構(gòu)造器,只能獲取public修飾的構(gòu)造器
    @Test
    public void getConstructors(){
        //獲取類對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類.class;
        //提取類中的全部的構(gòu)造器對(duì)象(這里只能拿public修飾的構(gòu)造器)
        Constructor[] constructors=c.getConstructors();
        //遍歷構(gòu)造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName()+"\t構(gòu)造器參數(shù)個(gè)數(shù)為:"+constructor.getParameterCount()+"個(gè)");
        }
        //運(yùn)行結(jié)果:IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:2個(gè)
    }
 
    //2、getDeclaredConstructors
    //獲取全部的構(gòu)造器:只要你敢寫,這里就能拿到,無(wú)所謂權(quán)限是否可及
    @Test
    public void getDeclaredConstructors(){
        //獲取類對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類.class;
        //提取類中的全部的構(gòu)造器對(duì)象
        Constructor[] constructors=c.getDeclaredConstructors();
        //遍歷構(gòu)造器
        for (Constructor constructor : constructors) {
            System.out.println(constructor.getName()+"\t構(gòu)造器參數(shù)個(gè)數(shù)為:"+constructor.getParameterCount()+"個(gè)");
        }
        //運(yùn)行結(jié)果:
        // IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:0個(gè)
        // IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:2個(gè)
    }
 
    //3、getConstructor
    //獲取某個(gè)構(gòu)造器:只能拿Public修飾的某個(gè)構(gòu)造器
    @Test
    public void getConstructor() throws Exception {
        //獲取類對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類.class;
        //定位單個(gè)構(gòu)造器對(duì)象(按照參數(shù),這里定位的是有參的構(gòu)造器)
        Constructor cons=c.getConstructor(String.class,int.class);
       // Constructor cons=c.getConstructor();//如果獲取無(wú)參構(gòu)造器,但因?yàn)槲以O(shè)置的是private私有的,權(quán)限不足無(wú)法獲取,便會(huì)報(bào)錯(cuò)
        System.out.println(cons.getName()+"\t構(gòu)造器參數(shù)個(gè)數(shù)為:"+cons.getParameterCount()+"個(gè)");
        //運(yùn)行結(jié)果:IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:2個(gè)
    }
    //4、getDeclaredConstructor
    //獲取某個(gè)構(gòu)造器:只要你敢寫,這里就能拿到,無(wú)所謂權(quán)限是否可及
    //一般是用這個(gè),什么都可以獲取,并且是根據(jù)自己需要什么而獲取
    @Test
    public void getDeclaredConstructor() throws Exception {
        //獲取類對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類.class;
        //定位單個(gè)構(gòu)造器對(duì)象(按照參數(shù),這里定位的是有參的構(gòu)造器)
        Constructor cons=c.getDeclaredConstructor(String.class,int.class);
        System.out.println(cons.getName()+"\t構(gòu)造器參數(shù)個(gè)數(shù)為:"+cons.getParameterCount()+"個(gè)");
        //運(yùn)行結(jié)果:IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:2個(gè)
 
        //獲取類對(duì)象
        Class c2=反射機(jī)制_2實(shí)驗(yàn)類.class;
        //定位單個(gè)構(gòu)造器對(duì)象(按照參數(shù)定位無(wú)參構(gòu)造器)
        Constructor cons2=c2.getDeclaredConstructor();
        System.out.println(cons2.getName()+"\t構(gòu)造器參數(shù)個(gè)數(shù)為:"+cons2.getParameterCount()+"個(gè)");
        //運(yùn)行結(jié)果:IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:0個(gè)
    }
}

Class在開發(fā)中最常見的用法就是將Class類對(duì)象實(shí)例化為自定義類的對(duì)象,即可通過(guò)一個(gè)給定的字符串(類的全限定類名)實(shí)例化一個(gè)本類的對(duì)象。將Class對(duì)象實(shí)例化為本類對(duì)象時(shí),可以通過(guò)無(wú)參構(gòu)造完成,也可以通過(guò)有參構(gòu)造完成。 

創(chuàng)建對(duì)象:

import org.junit.Test;
import java.lang.reflect.Constructor;
 
//反射可以破壞封裝性,私有的也可以執(zhí)行了
public class 反射機(jī)制_2創(chuàng)建對(duì)象 {
    @Test
    public void getDeclaredConstructor() throws Exception {
        //獲取類對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類.class;
        //定位單個(gè)構(gòu)造器對(duì)象(按照參數(shù),這里定位的是有參的構(gòu)造器)
        Constructor cons=c.getDeclaredConstructor(String.class,int.class);
        System.out.println(cons.getName()+"\t構(gòu)造器參數(shù)個(gè)數(shù)為:"+cons.getParameterCount()+"個(gè)");
        反射機(jī)制_2實(shí)驗(yàn)類 s1= (反射機(jī)制_2實(shí)驗(yàn)類) cons.newInstance("狗蛋",18);
        System.out.println(s1);
        System.out.println();
 
        //獲取類對(duì)象
        Class c2=反射機(jī)制_2實(shí)驗(yàn)類.class;
        //定位單個(gè)構(gòu)造器對(duì)象(按照參數(shù)定位無(wú)參構(gòu)造器)
        Constructor cons2=c2.getDeclaredConstructor();
        System.out.println(cons2.getName()+"\t構(gòu)造器參數(shù)個(gè)數(shù)為:"+cons2.getParameterCount()+"個(gè)");
 
        //如果遇到了私有的構(gòu)造器,可以暴力反射
        cons2.setAccessible(true);//權(quán)限打開(只是這一次有效,并不是一直打開)
 
        反射機(jī)制_2實(shí)驗(yàn)類 s2= (反射機(jī)制_2實(shí)驗(yàn)類) cons2.newInstance();
        System.out.println(s2);
 
        //運(yùn)行結(jié)果:
        //IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:2個(gè)
        //有參構(gòu)造器執(zhí)行!
        //反射機(jī)制_2實(shí)驗(yàn)類{name='狗蛋', age=18}
        //
        //IT2.反射機(jī)制_2實(shí)驗(yàn)類    構(gòu)造器參數(shù)個(gè)數(shù)為:0個(gè)
        //無(wú)參構(gòu)造器執(zhí)行!
        //反射機(jī)制_2實(shí)驗(yàn)類{name='null', age=0}
    }
}

使用反射技術(shù)獲取成員變量對(duì)象并使用

實(shí)驗(yàn)類:

public class 反射機(jī)制_2實(shí)驗(yàn)類2 {
    private String name;
    private int age;
    public static String schoolName;
    public static final String Name="遇安";
 
    public 反射機(jī)制_2實(shí)驗(yàn)類2() {
        System.out.println("無(wú)參構(gòu)造器執(zhí)行!");
    }
 
    public 反射機(jī)制_2實(shí)驗(yàn)類2(String name, int age) {
        System.out.println("有參構(gòu)造器執(zhí)行!");
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public static String getSchoolName() {
        return schoolName;
    }
 
    public static void setSchoolName(String schoolName) {
        反射機(jī)制_2實(shí)驗(yàn)類2.schoolName = schoolName;
    }
 
    @Override
    public String toString() {
        return "反射機(jī)制_2實(shí)驗(yàn)類2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 獲取成員變量:

在反射操作中可以獲取一個(gè)類中的全部屬性,但是類中的屬性包括兩部分,即從父類繼承的屬性和本類定義的屬性。因此,在獲取類的屬性時(shí)也有以下兩種不同的方式:

1、獲取實(shí)現(xiàn)的接口或父類中的公共屬性:public Field [] getFields throws SecurityException

2、獲取本類中的全部屬性:public Field [] getDeclaredFields throws Exception

上述兩種方法返回的都是Field數(shù)組,每一個(gè)Field對(duì)象表示類中的一個(gè)屬性。如果要獲取屬性中的詳細(xì)信息,就需要調(diào)用Field類的方法。

import org.junit.Test;
 
import java.lang.reflect.Field;
 
public class 反射機(jī)制_2獲取成員變量 {
    //1、獲取全部的成員變量
  //  Field[] getDeclaredFields
    //獲得所有的成員變量對(duì)應(yīng)的Field對(duì)象,只要申明了就可以得到
    @Test
    public void getDeclaredFields(){
        //定位Class對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類2.class;
        //定位全部成員變量
        Field [] fields=c.getDeclaredFields();
        //遍歷獲取,常量也會(huì)被當(dāng)做成員變量
        for (Field field : fields) {
            System.out.println(field.getName()+"的類型是:"+field.getType());
        }
    }
 
    //2、獲取某個(gè)成員變量對(duì)象
    //Field getDeclaredField(String name)
    @Test
    public void getDeclaredField() throws Exception {
        //定位Class對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類2.class;
        //根據(jù)名稱定位某個(gè)成員變量
        Field f=c.getDeclaredField("age");
        System.out.println(f);
        System.out.println(f.getName()+"的類型是:"+f.getType());
    }
}

運(yùn)行結(jié)果:

Test1、

name的類型是:class java.lang.String
age的類型是:int
schoolName的類型是:class java.lang.String
COUNTTRY的類型是:class java.lang.String 

Test2、

private int IT2.反射機(jī)制_2實(shí)驗(yàn)類2.age
age的類型是:int

 獲取了成員變量有什么用呢?

import org.junit.Test;
 
import java.lang.reflect.Field;
 
public class 反射機(jī)制_2獲取成員變量 {
    //獲取了成員變量有什么用呢?
    @Test
    public void demo() throws Exception {
        //反射第一步獲取Class對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類2.class;
        //提取某個(gè)成員變量
        Field f=c.getDeclaredField("age");
 
        f.setAccessible(true);//因?yàn)槲业腶ge成員變量是用private修飾的,所以需要暴力打開權(quán)限
 
        //作用一:賦值
        反射機(jī)制_2實(shí)驗(yàn)類2 s=new 反射機(jī)制_2實(shí)驗(yàn)類2();
        f.set(s,18);//s.setAge(18);
        System.out.println(s);
        //運(yùn)行結(jié)果:
        // 無(wú)參構(gòu)造器執(zhí)行!
        //反射機(jī)制_2實(shí)驗(yàn)類2{name='null', age=18}這里可以看出,成員變量被賦值成功
 
        //作用二:取值
        int age = (int) f.get(s);
        System.out.println(age);//18
    }
}

使用反射技術(shù)獲取方法對(duì)象并使用

實(shí)驗(yàn)類:

public class 反射機(jī)制_2實(shí)驗(yàn)類3 {
    private String name;
 
    public 反射機(jī)制_2實(shí)驗(yàn)類3() {
 
    }
 
    public 反射機(jī)制_2實(shí)驗(yàn)類3(String name) {
        this.name = name;
    }
    public void run(){
        System.out.println("跑起來(lái)了。。");
    }
 
    private void eat(){
        System.out.println("累了,該吃飯了。。");
    }
    private String eat(String name){
        System.out.println("那就淺吃一下"+name+"吧");
        return "針不戳";
    }
    public static void ind(){
        System.out.println("歡迎來(lái)到遇安的博客!");
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
}

 獲取成員方法:

import org.junit.Test;
 
import java.lang.reflect.Method;
 
public class 反射機(jī)制_2獲取成員方法 {
    //獲得類中的所有成員方法對(duì)象
    @Test
    public void getDeclaredMethods(){
        //獲取類對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類3.class;
        //提取全部方法,包括私有的
        Method [] methods=c.getDeclaredMethods();
        //遍歷全部方法
        for (Method method : methods) {
            System.out.println(method.getName()+"返回值類型:"+method.getReturnType()+"參數(shù)個(gè)數(shù):"+method.getParameterCount());
        }
    }
    //提取某個(gè)方法對(duì)象
    @Test
    public void getDeclaredMethod() throws Exception {
        //獲取類對(duì)象
        Class c=反射機(jī)制_2實(shí)驗(yàn)類3.class;
        //提取單個(gè)方法對(duì)象
        Method m1=c.getDeclaredMethod("eat");
        Method m2=c.getDeclaredMethod("eat",String.class);
 
        //暴力打開權(quán)限
        m1.setAccessible(true);
        m2.setAccessible(true);
 
        //觸發(fā)方法的執(zhí)行
        反射機(jī)制_2實(shí)驗(yàn)類3 s=new 反射機(jī)制_2實(shí)驗(yàn)類3();
        //注意:如果方法是沒(méi)有結(jié)果返回的,那么返回的是Null
        Object result =m1.invoke(s);
        System.out.println(result);
 
        Object result2=m2.invoke(s,"海鮮大餐");
        System.out.println(result2);
    }
}

運(yùn)行結(jié)果:

累了,該吃飯了。。
null
那就淺吃一下海鮮大餐吧
針不戳

總結(jié)

到此這篇關(guān)于Java如何通過(guò)反射獲取Constructor、Field、Method對(duì)象的文章就介紹到這了,更多相關(guān)Java反射獲取對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Mail發(fā)送郵件功能

    SpringBoot整合Mail發(fā)送郵件功能

    我們?cè)诰W(wǎng)站上注冊(cè)賬號(hào)的時(shí)候一般需要獲取驗(yàn)證碼,而這個(gè)驗(yàn)證碼一般發(fā)送在你的手機(jī)號(hào)上還有的是發(fā)送在你的郵箱中,注冊(cè),賬號(hào)密碼…都需要用到驗(yàn)證,今天就演示一下如何用SpringBoot整合Mail發(fā)送郵箱
    2021-11-11
  • JDBC連接MySql數(shù)據(jù)庫(kù)步驟 以及查詢、插入、刪除、更新等

    JDBC連接MySql數(shù)據(jù)庫(kù)步驟 以及查詢、插入、刪除、更新等

    這篇文章主要介紹了JDBC連接MySql數(shù)據(jù)庫(kù)步驟,以及查詢、插入、刪除、更新等十一個(gè)處理數(shù)據(jù)庫(kù)信息的功能,需要的朋友可以參考下
    2018-05-05
  • Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例

    Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例

    這篇文章主要介紹了Java編程實(shí)現(xiàn)對(duì)十六進(jìn)制字符串異或運(yùn)算代碼示例,簡(jiǎn)述了異或運(yùn)算以及具體實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • 一文教你如何使用原生的Feign

    一文教你如何使用原生的Feign

    Feign使得 Java HTTP 客戶端編寫更方便,Feign 靈感來(lái)源于Retrofit、JAXRS-2.0和WebSocket,這篇文章主要給大家介紹了如何使用原生的Feign的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • SpringBoot?整合Thymeleaf教程及使用方法

    SpringBoot?整合Thymeleaf教程及使用方法

    Thymeleaf?是一款用于渲染?XML/XHTML/HTML5?內(nèi)容的模板引擎,它與?JSP,Velocity,FreeMaker?等模板引擎類似,也可以輕易地與?Spring?MVC?等?Web?框架集成,這篇文章主要介紹了SpringBoot?整合Thymeleaf教程及使用,需要的朋友可以參考下
    2023-11-11
  • 簡(jiǎn)單聊一聊Spring中Bean別名的處理原理

    簡(jiǎn)單聊一聊Spring中Bean別名的處理原理

    今天來(lái)和小伙伴們聊一聊 Spring 中關(guān)于 Bean 別名的處理邏輯,別名,顧名思義就是給一個(gè) Bean 去兩個(gè)甚至多個(gè)名字,整體上來(lái)說(shuō),在 Spring 中,有兩種不同的別名定義方式,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2023-09-09
  • Springboot應(yīng)用gradle?Plugin示例詳解

    Springboot應(yīng)用gradle?Plugin示例詳解

    這篇文章主要介紹了Springboot應(yīng)用gradle?Plugin詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • linux中java獲取路徑的實(shí)例代碼

    linux中java獲取路徑的實(shí)例代碼

    在本篇文章里小編給大家整理的是一篇關(guān)于linux中java獲取路徑的實(shí)例代碼以及相關(guān)知識(shí)點(diǎn),有興趣的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • 一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    一文帶你看懂Android動(dòng)畫的實(shí)現(xiàn)原理

    動(dòng)畫是 Android 應(yīng)用程序中重要的交互特性,ndroid 提供了多種動(dòng)畫效果,包括平移、縮放、旋轉(zhuǎn)和透明度等,它們可以通過(guò)代碼或 XML 來(lái)實(shí)現(xiàn),本文將介紹 Android 動(dòng)畫的原理和實(shí)現(xiàn)方法,并提供一些示例,需要的朋友可以參考下
    2023-07-07
  • Java線程變量ThreadLocal詳細(xì)解讀

    Java線程變量ThreadLocal詳細(xì)解讀

    這篇文章主要介紹了Java線程變量ThreadLocal詳細(xì)解讀,多線程訪問(wèn)同一個(gè)變量的時(shí)候,很容易出現(xiàn)問(wèn)題,特別是多線程對(duì)一個(gè)共享變量進(jìn)行寫入的時(shí)候,為了線程的安全在進(jìn)行數(shù)據(jù)寫入時(shí)候會(huì)進(jìn)行數(shù)據(jù)的同步,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

石楼县| 泽普县| 虞城县| 江源县| 合川市| 出国| 张北县| 加查县| 石嘴山市| 闻喜县| 喀喇沁旗| 吴桥县| 乐安县| 资溪县| 铁力市| 卓资县| 永济市| 积石山| 涟源市| 信丰县| 彰化市| 蒙山县| 吉安县| 米泉市| 崇州市| 定兴县| 灵山县| 徐水县| 永丰县| 宾川县| 满城县| 卢氏县| 交口县| 横峰县| 大渡口区| 沈阳市| 常德市| 新昌县| 洞口县| 乌拉特前旗| 伊吾县|