国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java反射獲取類和對象信息全解析

imtianx / 2024人閱讀

摘要:反射可以解決在編譯時無法預(yù)知對象和類是屬于那個類的,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題。此處的對應(yīng)種基本類型,如果該成員變量的類型是引用類型的,則去掉部分將對象的該成員變量設(shè)置為值。

反射可以解決在編譯時無法預(yù)知對象和類是屬于那個類的,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題。

在兩個人協(xié)作開發(fā)時,你只要知道對方的類名就可以進行初步的開發(fā)了。

獲取類對象

Class.forName(String clazzName)靜態(tài)方法

調(diào)用類的class屬性,Person.class返回的就是Person的class對象(推薦使用)

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

具體使用還是要根據(jù)實際來選擇,第一種方式是比較自由的,只要知道一個類名就可以了,其不會做該類是否存在的校驗,第二種、第三種則會做校驗

獲取類的信息
獲取類構(gòu)造器

Connstructor getConstructor(Class...parameterTypes):返回此Class對象對應(yīng)類的帶指定形參的public構(gòu)造器

Constructor[] getConstructors():返回此Class對象對應(yīng)類的所有public構(gòu)造器

Constructor[] getDeclaredConstructor(Class...parameterTypes):返回此class對象對應(yīng)類的帶指定參數(shù)的構(gòu)造器,與構(gòu)造器的訪問權(quán)限無關(guān)

Constructor[] getDeclaredConstructors():返回此class對象對應(yīng)類的所有構(gòu)造器,與構(gòu)造器的訪問權(quán)限無關(guān)

獲取類成員方法

Method getMethod(String name,Class...parameterTypes):返回此class對象對應(yīng)類的帶指定形參的public方法

Method[] getMethods():返回此class對象所表示的類的所有public方法

Method getDeclaredMethod(string name,Class...parameterTypes):返回此class對象對應(yīng)類的帶指定形參的方法,與方法訪問權(quán)限無關(guān)

Method[] getDeclaredMethods():返回此class對象對應(yīng)類的全部方法,與方法的訪問權(quán)限無關(guān)

獲取類成員變量

Field getField(String name):返回此class對象對應(yīng)類的指定名稱的public成員變量

Field[] getFields():返回此class對象對應(yīng)類的所有public成員變量

Field getDeclaredField(String name):返回此class對象對應(yīng)類的指定名稱的成員變量,與成員變量訪問權(quán)限無關(guān)

Field[] getDeclaredFields():返回此class對象對應(yīng)類的全部成員變量,與成員變量的訪問權(quán)限無關(guān)

獲取類注解

A getAnnotation(ClassannotationClass):嘗試獲取該class對象對應(yīng)類上村子的指定類型的Annotation,如果該類型注解不存在,則返回null

A getDeclaredAnnotation(ClassannotationClass):這是Java 8中新增的,該方法獲取直接修飾該class對象對應(yīng)類的指定類型的Annotation,如果不存在,則返回null

Annotation[] getAnnotations():返回修飾該class對象對應(yīng)類上存在的所有Annotation

Annotation[] getDeclaredAnnotations():返回修飾該Class對象對應(yīng)類上存在的所有Annotation

A[] getAnnotationByType(ClassannotationClass):該方法的功能與前面介紹的getAnnotation()方法基本相似,但由于Java8增加了重復(fù)注解功能,因此需要使用該方法獲取修飾該類的指定類型的多個Annotation

A[] getDeclaredAnnotationByType(ClassannotationClass):該方法發(fā)功能與前面介紹的getDeclaredAnnotations()方法相似,也是因為Java8的重復(fù)注解的功能,需要使用該方法獲取直接修飾該類的指定類型的多個Annotation

獲取該類內(nèi)部類

Class[] getDeclaredClasses():返回該class隊形對應(yīng)類里包含的全部內(nèi)部類

獲取該類對象所在的外部類

Class getDeclaringClass():返回該Class對象對應(yīng)類所在的外部類

獲取該類對象對應(yīng)類所實現(xiàn)的接口

Class[] getInterfaces():返回該Class對象對應(yīng)類所實現(xiàn)的全部接口

獲取該類對象對應(yīng)類所繼承的父類

Class getSuperclass():返回該Class對象對應(yīng)類的超類的Class對象

獲取該類對象對應(yīng)類的修飾符、所在包、類名等基本信息

int getModifiers():返回此類或接口的所有修飾符,修飾符由public、protected、private、final、static、abstract等對應(yīng)的常量組成,返回的整數(shù)應(yīng)使用Modifier工具類的方法來解碼,才可以獲取真是的修飾符

Package getPackage():獲取該類的包

String getName():以字符串形式返回此CLass對象所表示的類的簡稱

判斷該類是否為接口、枚舉、注解類型

boolean isAnnotation():返回此class對象是否表示一個注解類型

boolean isAnnotationPresent(ClassannotationClass):判斷此Class對象是否使用類Annotation修飾

boolean isAnonymousClass():返回此class對象是否是一個匿名類

boolean isArray():返回此class對象是否表示一個數(shù)組類

boolean isEnum():返回此class對象是否表示一個枚舉

boolean isInterface():返回此class對象是否表示一個接口

boolean isInstance(Object obj):判斷obj是否是此class對象的實例,該方法可以完全代替instanceof操作符

public interface Colorable {
     public void value();
}
public class ClassInfo {
    
    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class cls=Colorable.class;
        System.out.println(cls.getMethod("value"));
        System.out.println(cls.isAnnotation());
        System.out.println(cls.isInterface());
    }

}

結(jié)果

public abstract void com.em.Colorable.value()
false
true
Java8中新增的方法參數(shù)反射

int getParameterCount():獲取該構(gòu)造器或方法的形參個數(shù)

Parameter[] getParameters():獲取該構(gòu)造器或方法的所有形參

getModifiers():獲取修飾該形參的修飾符

String getName():獲取形參名

Type getParameterizedType():獲取帶泛型的形參類型

ClassgetType():獲取形參類型

boolean isNamePresent():該方法返回該類的class文件中是否包含了方法的形參名信息

boolean isVarArgs():該方法用于判斷該參數(shù)是否為個數(shù)可變的形參

public class Test {
    public void getInfo(String str,Listlist){
        System.out.println("成功");
    }
}
public class ClassInfo {
    
    public static void main(String[] args) throws NoSuchMethodException, SecurityException {
        Class cls=Test.class;
        Method med=cls.getMethod("getInfo", String.class,List.class);
        System.out.println(med.getParameterCount());
        Parameter[] params=med.getParameters();
        System.out.println(params.length);
        for(Parameter par:params){
            System.out.println(par.getName());
            System.out.println(par.getType());
            System.out.println(par.getParameterizedType());
        }
    }

}

結(jié)果

2
2
arg0
class java.lang.String
class java.lang.String
arg1
interface java.util.List
java.util.List
反射生成對象

使用Class對象的newInstance()方法創(chuàng)建Class對象的實例,該方法要求要有默認(rèn)構(gòu)造器(比較常用)

先使用Class對象獲取指定的Constructor對象,在調(diào)用Constructor對象的newInstance()方法來創(chuàng)建該Class對象對應(yīng)類的實例

反射調(diào)用方法

Object invoke(Object obj,Object...args):該方法中的obj是執(zhí)行該方法的主調(diào),后面的args是執(zhí)行該方法時傳入該方法的實參

public class Test {
    
    public Test(String str) {
        System.out.println(str);
    }
    public void getInfo(String str){
        System.out.println(str);
    }
}
public class ClassInfo {
    
    public static void main(String[] args) throws Exception {
        Class cls=Test.class;
        Constructorconstruct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
        Method med=cls.getMethod("getInfo", String.class);
        med.invoke(test, "調(diào)用方法成功");
    }

}

結(jié)果

初始化
調(diào)用方法成功

接下來看官仔細(xì)看下面的栗子

public class Test {
    
    public Test(String str) {
        System.out.println(str);
    }
    //私有方法
    private void getInfo(String str){
        System.out.println(str);
    }
}
public class ClassInfo {
    
    public static void main(String[] args) throws Exception {
        Class cls=Test.class;
        Constructorconstruct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
      //為啥使用這個方法呢?
        Method med=cls.getDeclaredMethod("getInfo", String.class);
      //為啥使用這個方法呢?
        med.setAccessible(true);
        med.invoke(test, "調(diào)用方法成功");
    }

}

結(jié)果

初始化
調(diào)用方法成功

setAccessible(boolean flag):將值設(shè)為true,指示該Method在使用是應(yīng)該取消Java語言的訪問權(quán)限檢查

訪問成員變量值

getXxx(Object obj):獲取obj對象的該成員變量的值。此處的Xxx對應(yīng)8種基本類型,如果該成員變量的類型是引用類型的,則去掉Xxx部分

setXxx(Object obj,Xxx val):將obj對象的該成員變量設(shè)置為val值。此處的Xxx對應(yīng)8中基本類型,如果該成員變量的類型是引用類型,則取消set后面的Xxx

以上兩個方法可以方法所有的成員變量,包括private的私有成員變量

public class Test {
    private int num;
    
    public Test(String str) {
        System.out.println(str);
    }
    private void getInfo(String str){
        System.out.println(str);
    }
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }
    
}
public class ClassInfo {
    
    public static void main(String[] args) throws Exception {
        Class cls=Test.class;
        Constructorconstruct=cls.getConstructor(String.class);
        Test test=construct.newInstance("初始化");
        Method med=cls.getDeclaredMethod("getInfo", String.class);
        med.setAccessible(true);
        med.invoke(test, "調(diào)用方法成功");
        Field fld=cls.getDeclaredField("num");
        fld.setAccessible(true);
        fld.setInt(test, 12);
        System.out.println(fld.getInt(test));
    }

}

結(jié)果

初始化
調(diào)用方法成功
12
操作數(shù)組

java.lang.reflect包下有一個Array類,其可以動態(tài)創(chuàng)建數(shù)組

static Object newInstance(ClasscomponentType,int...length):創(chuàng)建一個具有指定的元素類型、指定維度的新數(shù)組

static xxx getXxx(Object array,int index):返回array數(shù)組中第index個元素。其中xxx是各種基本數(shù)據(jù)類型,如果數(shù)組元素是引用類型,則該方法變?yōu)間et()

static void setXxx(Object array,int index,xxx val):將array數(shù)組中低index 個元素的值設(shè)為val,其中xxx是各種基本數(shù)據(jù)類型,如果數(shù)組元素是引用類型,則該方法變?yōu)閟et()

public class ArrayInfo {

    public static void main(String[] args) {
        Object arrays=Array.newInstance(String.class, 3);
        Array.set(arrays, 0, "第一個");
        Array.set(arrays, 1, "第二個");
        Array.set(arrays, 2, "第三個");
        System.out.println(Array.get(arrays, 2));
    }
}

更多內(nèi)容可以關(guān)注微信公眾號,或者訪問AppZone網(wǎng)站

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64783.html

相關(guān)文章

  • Java筆記-反射機制(一)

    摘要:反射機制一結(jié)合官方通過編寫的反射教程,復(fù)習(xí)一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應(yīng)用行為的一種工具。因為反射需要動態(tài)的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權(quán)限,在特定的安全環(huán)境下不一定存在。 Java反射機制(一) 結(jié)合Oracle官方通過JDK8編寫的反射教程,復(fù)習(xí)一下反射的知識。結(jié)尾篇補一個小例子。 主要內(nèi)容 這次博客的主要內(nèi)容就是簡...

    AWang 評論0 收藏0
  • 反射機制與原理筆記

    反射機制與原理筆記 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請注明出處https://segmentfault.com/u/yzwall 反射機制 反射:當(dāng)程序無法獲知對象類型時,在運行期間動態(tài)獲取類的所有屬性和方法,這種動態(tài)獲取類信息和動態(tài)調(diào)用對象方法的功能稱為反射機制;反射機制實現(xiàn):Class類與java.lang.reflect類庫一起實現(xiàn)機制,java.lang.reflect類庫包含F(xiàn)ield...

    fobnn 評論0 收藏0
  • java

    摘要:多線程編程這篇文章分析了多線程的優(yōu)缺點,如何創(chuàng)建多線程,分享了線程安全和線程通信線程池等等一些知識。 中間件技術(shù)入門教程 中間件技術(shù)入門教程,本博客介紹了 ESB、MQ、JMS 的一些知識... SpringBoot 多數(shù)據(jù)源 SpringBoot 使用主從數(shù)據(jù)源 簡易的后臺管理權(quán)限設(shè)計 從零開始搭建自己權(quán)限管理框架 Docker 多步構(gòu)建更小的 Java 鏡像 Docker Jav...

    honhon 評論0 收藏0
  • java反射-類

    摘要:使用反射可以在運行時檢視類。類名類修飾符等包信息超類所實現(xiàn)的接口構(gòu)造函數(shù)方法屬性注解類中附加了很多信息,你可以在獲得一個完整列表。全限定名包含所有的包名。構(gòu)造函數(shù)你可以訪問類的構(gòu)造函數(shù),代碼如下構(gòu)造函數(shù)的詳細(xì)教程在章節(jié)。 使用反射可以在運行時檢視Java類。檢視類通常是使用反射時所做的第一件事情。從類中可以獲得下面的信息。 類名 類修飾符(private、public、synchro...

    FrancisSoung 評論0 收藏0
  • Java面試通關(guān)要點匯總集(基礎(chǔ)篇之基本功,非原作者)

    摘要:面試通關(guān)要點匯總集部分解答說明如果你有幸能看到的話,本文整體框架來自阿里梁桂釗的博文,總結(jié)的非常不錯。這樣做的目的是對內(nèi)部數(shù)據(jù)進行了不同級別的保護,防止錯誤的使用了對象的私有部分。被繼承的類稱為基類和父類或超類。 showImg(https://segmentfault.com/img/remote/1460000013442471?w=1280&h=819); Java面試通關(guān)要點匯...

    smallStone 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<