咱們一起來探討Java的反射吧

一.為什么使用反射?反射是什么?

反射可以解決在編譯時無法預(yù)知對象和類是屬于那個類的,要根據(jù)程序運行時的信息才能知道該對象和類的信息的問題。在兩個人協(xié)作開發(fā)時,你只要知道對方的類名就可以進行初步的開發(fā)了。

JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制。

二.從案例學(xué)習(xí)如何使用反射

public class Man implements AnimalBaseSkill{
    
    public int sex=-1;    
    private String name;    
    private Man(int sex, String name) {      
        this.sex = sex;        
        this.name = name;    
    }    
    public Man() {         
    }    
    public int getSex() {        
        return sex;    
    }    
    public void setSex(int sex) {        
        this.sex = sex;    
    }    
    public String getName() {        
        return name;    
    }    
    public void setName(String name) {        
        this.name = name;    
    }

    @Override
    public void eat() {}
    

    private class Clan {    
        String clanName="default family";    
        public Clan(String familyName) {        
            this.clanName = familyName;    
        }    
        public Clan() {    

        }    
        public String getClanName() {        
            return clanName;    
        }    
        public void setClanName(String clanName) {        
            this.clanName = clanName;    
        }
    }
}
1.如何通過反射獲取Person對象?
  1. Class.forName(String clazzName)靜態(tài)方法
  • 調(diào)用類的class屬性,Person.class返回的就是Person的class對象(推薦使用)
  • 調(diào)用某個對象的getClass()方法

eg.

Class class1 = Class.forName("com.ch.java.reflect.Man");
Class class2 = Man.class;
Class class3 =Man.getClass();

但是只有方法一可以獲取私有內(nèi)部類:

Class class_clan=Class.forName("com.ch.java.reflect.Man$Clan");

獲取Class后,然后通過Class獲取構(gòu)造器,通過newInstance()就可以獲取該對象:

Constructor constructor=class1.getConstructor(null); 
Man man= (Man) constructor.newInstance();

但是內(nèi)部類的對象要像下面獲取,原因會在(如何獲取類構(gòu)造器?)講解

Constructor constructor=class_clan.getConstructor(Man.class, String.class);
Object family=constructor.newInstance(man, "123");
2.如何獲取類構(gòu)造器?
  1. getConstructor(Class...parameterTypes):返回此Class對象對應(yīng)類的帶指定形參的public構(gòu)造器,返回參數(shù):Connstructor
  • getConstructors():返回此Class對象對應(yīng)類的所有public構(gòu)造器,返回參數(shù):Constructor[]
  • getDeclaredConstructor(Class...parameterTypes):返回此class對象對應(yīng)類的帶指定參數(shù)的構(gòu)造器,與構(gòu)造器的訪問權(quán)限無關(guān),返回參數(shù):Constructor[]
  • getDeclaredConstructors():返回此class對象對應(yīng)類的所有構(gòu)造器,與構(gòu)造器的訪問權(quán)限無關(guān),返回參數(shù):Constructor[]

person對象的構(gòu)造器獲取很簡單,但是person內(nèi)部類的family對象的構(gòu)造器如何獲???它的坑點在哪里呢?

for (Constructor constructor1 : class_clan.getDeclaredConstructors()) {
    System.out.println(constructor1.toString());
}
打印:
public com.ch.java.reflect.Man$Clan(com.ch.java.reflect.Man,java.lang.String)
public com.ch.java.reflect.Man$Clan(com.ch.java.reflect.Man)
3.獲取類成員方法
  1. getMethod(String name,Class<?>...parameterTypes):返回此class對象對應(yīng)類的帶指定形參的public方法,返回參數(shù):Method
  • 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)
class_1.getMethods();
class_1.getDeclaredMethods();
for (Method method : methods) { 
     System.out.print(method.getName()+" "+method.getReturnType()+" "); 
     int i=0;  
     for (Class<?> aClass : method.getParameterTypes()) {
         i++; 
         System.out.print("params"+i+" "+aClass.toString()+" "); 
      }  
      System.out.print("\n");
}
打?。?getName class java.lang.String
setName void params1 class java.lang.String
color void params1 int
getSex int
setSex void params1 int
Disconnected from the target VM, address: '127.0.0.1:52500', transport: 'socket'wait void 
wait void params1 long params2 int
wait void params1 long
equals boolean params1 class java.lang.Object *********toString class java.lang.String 
hashCode int
getClass class java.lang.Class
notify void 
notifyAll void
4.獲取類成員變量
  1. Field getField(String name):返回此class對象對應(yīng)類的指定名稱的public成員變量
  • getFields():返回此class對象對應(yīng)類的所有public成員變量,返回參數(shù):Field[]
  • getDeclaredField(String name):返回此class對象對應(yīng)類的指定名稱的成員變量,與成員變量訪問權(quán)限無關(guān)。返回參數(shù):Field
  • getDeclaredFields():返回此class對象對應(yīng)類的全部成員變量,與成員變量的訪問權(quán)限無關(guān),返回參數(shù):Field[]
Field[] fields=class_1.getFields();
Field[] fields=class_1.getDeclaredFields();
for (Field field : fields) { 
    System.out.println(field.getName()+" "+field.getType());
}
打?。?sex int
age int
5.其他

獲取該類內(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<? super T> 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(Class<? extends Annotation>annotationClass):判斷此Class對象是否使用類Annotation修飾

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

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

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

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

boolean isInstance(Object obj):判斷obj是否是此class對象的實例,該方法可以完全代替instanceof操作符
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 12,309評論 6 13
  • 一、概述 1、Java反射機制(Java-Reflect): 在運行狀態(tài)中,對于任意一個類,都能夠知道這個類中的所...
    年少懵懂丶流年夢閱讀 4,579評論 0 5
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,628評論 18 399
  • 愛與緣分 ——此詩是看過電影《愛樂之城》后創(chuàng)作的 配圖來自《愛樂之城》海報 時常會想, 奇思妙想, 苦思冥想...
    別具一格格閱讀 643評論 0 1

友情鏈接更多精彩內(nèi)容