導航:首頁 > 編程語言 > java反射對象的方法

java反射對象的方法

發布時間:2023-01-24 01:41:47

『壹』 java課程分享Java的反射機制

Java反射機制是一個非常強大的功能,在很多大型項目比如Spring,Mybatis都可以看見反射的身影。通過反射機制我們可以在運行期間獲取對象的類型信息,利用這一特性我們可以實現工廠模式和代理模式等設計模式,同時也可以解決Java泛型擦除等令人苦惱的問題。下面java課程http://www.kmbdqn.com/就從實際應用的角度出發,來應用一下Java的反射機制。

反射基礎


p.s:本文需要讀者對反射機制的API有一定程度的了解,如果之前沒有接觸過的話,建議先看一下官方文檔的QuickStart。


在應用反射機制之前,首先我們先來看一下如何獲取一個對象對應的反射類Class,在Java中我們有三種方法可以獲取一個對象的反射類。


通過getClass方法


在Java中,每一個Object都有一個getClass方法,通過getClass方法我們可以獲取到這個對象對應的反射類:


Strings="ziwenxie";


Class<?>c=s.getClass();


通過forName方法


我們也可以調用Class類的靜態方法forName:


Class<?>c=Class.forName("java.lang.String");


使用.class


或者我們也可以直接使用.class:


Class<?>c=String.class;


獲取類型信息


在文章開頭我們就提到反射的一大好處就是可以允許我們在運行期間獲取對象的類型信息,下面我們通過一個例子來具體看一下。


首先我們在typeinfo.interfacea包下面新建一個介面A:


packagetypeinfo.interfacea;


publicinterfaceA{voidf();}


接著我們在typeinfo.packageaccess包下面新建一個介面C,介面C繼承自介面A,並且我們還另外創建了幾個用於測試的方法,注意下面幾個方法的許可權都是不同的。


『貳』 在JAVA中,怎麼利用反射獲取一個方法

java的反射用法:(異常請自行處理)
①找到類:Class cl = Class.forName("java.util.Date");
②創建對象(要求這個類中含有空參數的構造方法):Object obj = cl.newInstence();
③根據名稱和參數找方法:Method method1 = cl.getMethod("getTime");//如果沒有參數不用寫第二個參數如果有參數的如:Method method2 = cl.getMethod("setTime",long.class);
④在某個對象上面執行方法,Object result = method1.invoke(obj);//如果有參數的Object result = method2.invoke(obj,21317362721);
執行的方如果有返回值,將返回值返回,否則返回null

『叄』 JAVA中反射是什麼

JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。

Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。

Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。

(3)java反射對象的方法擴展閱讀:

JAVA中反射實例:

1、Class superClass=clazz.getSuperclass();//獲取父類。

System.out.println("getSuperclass:"+superClass)。

2、Class[] interfaces=clazz.getInterfaces();//獲取實現介面。

System.out.println("getInterfaces:"+interfaces.length)。

3、Constructor[] cons=clazz.getConstructors();//構造方法。

System.out.println("getConstructors:"+cons.length)。

參考資料來源:網路: JAVA反射機制

『肆』 java反射的幾個工具方法

//第一種方式獲取Class對象

Studentstu1=newStudent();//這一new產生一個Student對象,一個Class對象。
ClassstuClass=stu1.getClass();//獲取Class對象
System.out.println(stuClass.getName());

//第二種方式獲取Class對象

ClassstuClass2=Student.class;
System.out.println(stuClass==stuClass2);//判斷第一種方式獲取的Class對象和第二種方式獲取的是否是同一個

//第三種方式獲取Class對象

try{
ClassstuClass3=Class.forName("fanshe.Student");//注意此字元串必須是真實路徑,就是帶包名的類路徑,包名.類名
System.out.println(stuClass3==stuClass2);//判斷三種方式是否獲取的是同一個Class對象
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}

『伍』 什麼是java的反射

Java反射指的是對於任何的一個java類,我們都可以通過反射獲取到這個類的所有屬性和方法(包含私有的屬性方法),使用java反射我們也可以調用一個對象的任何方法。
我們知道Java是一門面向對象編程的語言,我們編程的時候,經常會將類的屬性進行封裝,然後提供public方法進行屬性的設置和獲取。類的屬性我們通常會設置成private的私有屬性,為的就是保護對象屬性不被隨意的修改和訪問。但是反射機制卻恰恰相反,通過反射,我們可以獲取到這些被保護的屬性和方法,並且可以修改和訪問他們。
在java中我們可以使用object對象的getClass();方法獲得Class的對象classObject;語法格式為 Class classObject = object.getClass() ;可以根據Class對象的方法獲取object對象的相關屬性和方法;
獲取object對象的名字可以使用 classObject.getName();獲取類的名稱,獲取到的結果包含包的名稱;
獲取object對象的包名稱,可以使用classObject.getPackage();獲取包的名稱;
獲取object對象的所有public屬性,可以使用classObject.getFields();方法,返回列表是屬性類Field[]對象列表;
獲取object對象所有屬性,可以使用classObject.getDeclaredFields();方法,返回的是所有屬性列表(包含private屬性);
獲取object對象某個特定的屬性,可以使用classObject.getField( fieldName );可以根據屬性名稱獲取屬性類的對象;
獲取object對象private屬性,可以使用classObject.getDeclaredField( fieldName );根據屬性名獲取屬性對象信息;
獲取object對象public方法,使用classObject.getMethods();可以獲取到方法類Method[]對象列表;
獲取object對象某個特定的public方法,使用classObject.getMethod( funName , Class... parameterTypes);根據方法名和方法參數類型列表,可以獲取到方法類的對象;
獲取object對象所有方法(包含private方法);使用classObject.getDeclaredMethods();可以獲取所有的方法對象列表;
獲取object對象某個特定方法(包含private方法),使用classObject.getDeclaredMethod ( funName, Class... parameterTypes );根據方法名和方法參數類型列表,可以獲取到類的特定方法(包含private方法);
獲取object對象類中所有的public構造方法,可以使用classObject.getConstructors(); 獲取到構造類Constructor的對象列表;
獲取object對象類中某個特定的構造方法,可以使用classObject.getConstructor( Class... parameterTypes ); 根據參數類型列表,獲取指定的構造函數對象;
獲取object對象類中所有的構造方法(包含private),可以使用classObject.getDeclaredConstructors(); 獲取到構造類Constructor的對象列表;
獲取object對象類中某個特定的構造方法(包含private),可以使用classObject.getDeclaredConstructor( Class... parameterTypes ); 根據參數類型列表,獲取指定的構造函數對象;

『陸』 北大青鳥java培訓:JAVA反射機制原理

運行時類型識別(Run-timeTypeIdentification,RTTI)主要有兩種方式,一種是我們在編譯時和運行時已經知道了所有的類型,另外一種是功能強大的「反射」機制。
要理解RTTI在Java中的工作原理,首先必須知道類型信息在運行時是如何表示的,這項工作是由「Class對象」完成的,它包含了與類有關的信息。
類是程序的重要組成部分,每個類都有一個Class對象,每當編寫並編譯了一個新類就會產生一個Class對象,它被保存在一個同名的.class文件中。
在運行時,當我們想生成這個類的對象時,運行這個程序的Java虛擬機(JVM)會確認這個類的Class對象是否已經載入,如果尚未載入,JVM就會根據類名查找.class文件,並將其載入,一旦這個類的Class對象被載入內存,它就被用來創建這個類的所有對象。
一般的RTTI形式包括三種:1.傳統的類型轉換。
如「(Apple)Fruit」,由RTTI確保類型轉換的正確性,如果執行了一個錯誤的類型轉換,就會拋出一個ClassCastException異常。
2.通過Class對象來獲取對象的類型。
如Classc=Class.forName(「Apple」);Objecto=c.newInstance();3.通過關鍵字instanceof或Class.isInstance()方法來確定對象是否屬於某個特定類型的實例,准確的說,應該是instanceof/Class.isInstance()可以用來確定對象是否屬於某個特定類及其所有基類的實例,這和equals()/==不一樣,它們用來比較兩個對象是否屬於同一個類的實例,沒有考慮繼承關系。
反射如果不知道某個對象的類型,可以通過RTTI來獲取,但前提是這個類型在編譯時必須已知,這樣才能使用RTTI來識別。
即在編譯時,編譯器必須知道所有通過RTTI來處理的類。
使用反射機制可以不受這個限制,它主要應用於兩種情況,第一個是「基於構件的編程」,在這種編程方式中,將使用某種基於快速應用開發(RAD)的應用構建工具來構建項目。
這是現在最常見的可視化編程方法,通過代表不同組件的圖標拖動到圖板上來創建程序,然後設置構件的屬性值來配置它們。
這種配置要求構件都是可實例化的,並且要暴露其部分信息,使得程序員可以讀取和設置構件的值。
當處理GUI時間的構件時還必須暴露相關方法的細細,以便RAD環境幫助程序員覆蓋這些處理事件的方法。
在這里,就要用到反射的機制來檢查可用的方法並返回方法名。
Java通過JavaBeans提供了基於構件的編程架構。
第二種情況,在運行時獲取類的信息的另外一個動機,就是希望能夠提供在跨網路的遠程平台上創建和運行對象的能力。
這被成為遠程調用(RMI),它允許一個Java程序將對象分步在多台機器上,江蘇java培訓http://www.kmbdqn.cn/認為這種分步能力將幫助開發人員執行一些需要進行大量計算的任務,充分利用計算機資源,提高運行速度。

『柒』 java中反射實例類裝載的步驟及簡要闡述

java反射和類裝載

反射機制:

Person p=new Person();
這是什麼?當然是實例化一個對象了.可是這種實例化對象的方法存在一個問題,那就是必須要知道類名才可以實例化它的對象,這樣我們在應用方面就會受到限制.那麼有沒有這樣一種方式,讓我們不知道這個類的類名就可以實例化它的對象呢?Thank Goodness!幸虧我們用的是java, java就提供了這樣的機制.

1).java程序在運行時可以獲得任何一個類的位元組碼信息,包括類的修飾符(public,static等),基類(超類,父類),實現的介面,欄位和方法等信息.
2).java程序在運行時可以根據位元組碼信息來創建該類的實例對象,改變對象的欄位內容和調用對象方法.
這樣的機制就叫反射技術.可以想像光學中的反射,就像我們照鏡子,鏡子中又出現一個自己(比喻可能不太恰當,但是足以表達清楚意思了).反射技術提供了一種通用的動態連接程序組件的方法,不必要把程序所需要的目標類硬編碼到源程序中,從而使得我們可以創建靈活的程序.

反射的實現步驟( 不問不需要答) ,

1、獲取類的常用方式有三種: a) Class.forName("包名.類名"),最常用、推薦;b) 包名.類名.class 最簡捷;c) 對象.getClass 的方式獲得。

2、對象的實例化,上面已經獲取了類,只需要調用類的實例化方法,類.newInstance()便可。

3、獲取屬性和構造等,可以參考 JavaApi 的調用,類. getDeclaredFields,類. getConstructor(..)等。

Java的反射機制是通過反射API來實現的,它允許程序在運行過程中取得任何一個已知名稱的類的內部信息.反射API位於java.lang.reflect包中.主要包括以下幾類:
1).Constructor類:用來描述一個類的構造方法
2).Field類:用來描述一個類的成員變數
3).Method類:用來描述一個類的方法.
4).Modifer類:用來描述類內各元素的修飾符
5).Array:用來對數組進行操作.
Constructor,Field,Method這三個類都是JVM(虛擬機)在程序運行時創建的,用來表示載入類中相應的成員.這三個類都實現了java.lang.reflect.Member介面,Member介面定義了獲取類成員或構造方法等信息的方法.要使用這些反射API,必須先得到要操作的對象或類的Class類的實例.通過調用Class類的newInstance方法(只能調用類的默認構造方法)可以創建類的實例.這樣有局限性,我們可以先沖類的Class實例獲取類需要的構造方法,然後在利用反射來創建類的一個實例.

類載入機制:



類的載入機制可以分為載入-鏈接-初始化三個階段,鏈接又可以分為驗證、准備、解析三個過程。

載入:通過類的載入器查找並載入二進制位元組流的過程,在堆內存中的方法區生成 一個代表這個類的 java.lang.Class 對象,作為這個類的數據請求入口。(這里可以把上面類載入器載入文件的過程描述一下(參考版本一,不作重復))。

驗證:主要是對一些詞法、語法進行規范性校驗,避免對 JVM 本身安全造成危害; 比如對文件格式,位元組碼驗證,無數據驗證等。但驗證階段是非必須的,可以通過參數 設置來進行關閉,以提高載入的時效。

准備:對類變數分配內存,並且對類變數預初始化,初始化成數據類型的原始值, 比如 static int a=11,會被初始化成成 a=0;如果是 static double a =11,則會被初始化成 a=0.0; 而成員變數只會成實例化後的堆中初始化。

解析:把常量池中的符號引用轉換為直接引用的過程。

初始化:對類的靜態變數和靜態塊中的變數進行初始化。(上面的准備階段可以作為 預初始化,初始到變數類型的原值,但如果被 final 修飾會進行真正初始化)

上面載入、鏈接、初始化的各個階段並不是彼此獨立,而是交叉進行,這點很重要 。

***class.forName和 classloader的區別

Class.forName 和 ClassLoader 都是用來裝載類的,對於類的裝載一般為分三個階段載入、鏈接、編譯,它們裝載類的方式是有區別。

首先看一下 Class.forName(..),forName(..)方法有一個重載方法 forName(className,boolean,ClassLoader),它有三個參數,第一個參數是類的包路徑,第二個參數是 boolean

類型,為 true 地表示 Loading 時會進行初始化,第三個就是指定一個載入器;當你調用class.forName(..)時,默認調用的是有三個參數的重載方法,第二個參數默認傳入 true,第三個參數默認使用的是當前類載入時用的載入器。

ClassLoader.loadClass()也有一個重載方法,從源碼中可以看出它默認調的是它的重載 方法 loadClass(name, false),當第二參數為 false 時,說明類載入時不會被鏈接。這也是兩者之間最大區別,前者在載入的時候已經初始化,後者在載入的時候還沒有鏈接。如果你需要在載入時初始化一些東西,就要用 Class.forName 了,比如我們常用的驅動載入, 實際上它的注冊動作就是在載入時的一個靜態塊中完成的。所以它不能被 ClassLoader 載入代替。

『捌』 請問java中的反射機制與用法

Java中反射常用知識:
1. 要想使用反射,首先需要獲得待處理類或對象所對應的Class對象。
2. 獲取某個類或某個對象所對應的Class對象的常用的3種方式:
a) 使用Class類的靜態方法forName:Class.forName(「java.lang.String」);
b) 使用類的.class語法:String.class;
c) 使用對象的getClass()方法:String s = 「aa」; Class<?> clazz = s.getClass();
3. 若想通過類的不帶參數的構造方法來生成對象,我們有兩種方式:
a) 先獲得Class對象,然後通過該Class對象的newInstance()方法直接生成即可:
Class<?> classType = String.class;
Object obj = classType.newInstance();
b) 先獲得Class對象,然後通過該對象獲得對應的Constructor對象,再通過該Constructor對象的newInstance()方法生成:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{});
Object obj = cons.newInstance(new Object[]{});
4. 若想通過類的帶參數的構造方法生成對象,只能使用下面這一種方式:
Class<?> classType = Customer.class;
Constructor cons = classType.getConstructor(new Class[]{String.class, int.class});
Object obj = cons.newInstance(new Object[]{「hello」, 3});
5. Integer.TYPE返回的是int,而Integer.class返回的是Integer類所對應的Class對象。

『玖』 java中的反射,invoke方法詳解

就是調用類中的方法,最簡單的用法是可以把方法參數化,invoke(class, method)比如你Test類里有一系列名字相似的方法setValue1、setValue2等等。可以把方法名存進數組v[],然後循環里invoke(test,v[i]),就順序調用了全部setValue

如:publicclass MyTest{publicstaticvoidmain(String[]args) {String[]names={"tom","tim","allen","alice"};

Class<?>clazz=Test.class;try Methodmethod=clazz.getMethod("sayHi",String.class);for(Stringname:names)method.invoke(clazz.newInstance(),name);}catch(NoSuchMethodExceptione)e.printStackTrace();}catch(IllegalAccessExceptie.printStackTrace(}catch(IllegalArgumentException{e.printStackTrace();}catch(InvocationTargetExceptione)e.printStackTrace();}catch(InstantiationExceptione{e.printStackTrace(}classTest{publicvoidsayHi(Stringname){System.out.println("Hi"+name);}

閱讀全文

與java反射對象的方法相關的資料

熱點內容
設備樹編譯vendor 瀏覽:369
app神州租車怎麼退訂單 瀏覽:864
幽默程序員的作文 瀏覽:287
linuxbenchmark 瀏覽:895
高分子pdf 瀏覽:689
加密電池測電流 瀏覽:894
電腦怎麼下載appstore 瀏覽:725
兩台電腦使用代理伺服器怎麼連接 瀏覽:231
初創公司買什麼配置的雲伺服器 瀏覽:165
程序員的實力測試 瀏覽:509
手機版寶可夢模組的伺服器怎麼進 瀏覽:119
qt在arm上編譯過程 瀏覽:124
黑白命令在哪裡 瀏覽:22
演算法崗問面試官的問題 瀏覽:117
720pjpg壓縮 瀏覽:525
經濟學人app怎麼用 瀏覽:734
thunderbird如何刪除伺服器 瀏覽:632
編譯內核模塊准備工作 瀏覽:187
protues單片機 瀏覽:680
淘寶想多開店怎麼租伺服器 瀏覽:581