導航:首頁 > 編程語言 > java反射類型轉換

java反射類型轉換

發布時間:2022-08-31 11:56:17

java反射帶參構造創建對象時如何自動轉換參數類型

importjava.lang.reflect.Constructor;
importjava.lang.reflect.InvocationTargetException;
importjava.lang.reflect.Method;


publicclassTestReflection
{
publicstaticvoidmain(String[]args)throwsClassNotFoundException,
InstantiationException,IllegalAccessException,IllegalArgumentException,SecurityException,InvocationTargetException,NoSuchMethodException
{
Strings="T";
Class<?>c=Class.forName(s);
Constructor<?>[]consts=c.getConstructors();
//定義有參構造
Constructor<?>consts1=null;
for(inti=0;i<consts.length;i++)
{
intparamsLength=consts[i].getParameterAnnotations().length;
if(paramsLength>0)
{
//判斷參數長度取得有參構造
consts1=consts[i];
}
}
//得到有參構造參數類型
Class<?>[]type=consts1.getParameterTypes();
//實驗性數據
Object[]values={"A","B","C"};
//得到對象
Objectobj=c.getConstructor(type).newInstance(values);

System.out.println(obj.getClass().getMethod("getA").invoke(obj));
System.out.println(obj.getClass().getMethod("getB").invoke(obj));
System.out.println(obj.getClass().getMethod("getC").invoke(obj));
}

}

classT
{
privateString a;

privateString b;

privateString c;

publicT()
{
System.out.println("T()wasloaded...");
}

publicT(Stringa,Stringb,Stringc)
{
System.out.println("T(String...s)wasloaded...");
this.a=a;
this.b=b;
this.c=c;
}

publicStringgetA()
{
returna;
}

publicvoidsetA(Stringa)
{
this.a=a;
}

publicStringgetB()
{
returnb;
}

publicvoidsetB(Stringb)
{
this.b=b;
}

publicStringgetC()
{
returnc;
}

publicvoidsetC(Stringc)
{
this.c=c;
}

}


㈡ 雲南java培訓分享JAVA反射機制原理

運行時類型識別(Run-time Type Identification, RTTI)主要有兩種方式,一種是我們在編譯時和運行時已經知道了所有的類型,另外一種是功能強大的「反射」機制。



要理解RTTI在Java中的工作原理,首先必須知道類型信息在運行時是如何表示的,這項工作是由「Class對象」完成的,它包含了與類有關的信息。類是程序的重要組成部分,每個類都有一個Class對象,每當編寫並編譯了一個新類就會產生一個Class對象,它被保存在一個同名的.class文件中。在運行時,當我們想生成這個類的對象時,運行這個程序的Java虛擬機(JVM)會確認這個類的Class對象是否已經載入,如果尚未載入,JVM就會根據類名查找.class文件,並將其載入,一旦這個類的Class對象被載入內存,它就被用來創建這個類的所有對象。一般的RTTI形式包括三種:


1.傳統的類型轉換。如「(Apple)Fruit」,由RTTI確保類型轉換的正確性,如果執行了一個錯誤的類型轉換,就會拋出一個ClassCastException異常。


2.通過Class對象來獲取對象的類型。如


Class c = Class.forName(「Apple」);


Object o = c.newInstance();


3.通過關鍵字instanceof或Class.isInstance()方法來確定對象是否屬於某個特定類型的實例,准確的說,應該是instanceof / Class.isInstance()可以用來確定對象是否屬於某個特定類及其所有基類的實例,這和equals() / ==不一樣,它們用來比較兩個對象是否屬於同一個類的實例,沒有考慮繼承關系。


反射


如果不知道某個對象的類型,可以通過RTTI來獲取,但前提是這個類型在編譯時必須已知,這樣才能使用RTTI來識別。即在編譯時,編譯器必須知道所有通過RTTI來處理的類。


使用反射機制可以不受這個限制,它主要應用於兩種情況,第一個是「基於構件的編程」,在這種編程方式中,將使用某種基於快速應用開發(RAD)的應用構建工具來構建項目。這是現在最常見的可視化編程方法,通過代表不同組件的圖標拖動到圖板上來創建程序,然後設置構件的屬性值來配置它們。這種配置要求構件都是可實例化的,並且要暴露其部分信息,使得程序員可以讀取和設置構件的值。當處理GUI時間的構件時還必須暴露相關方法的細細,以便RAD環境幫助程序員覆蓋這些處理事件的方法。在這里,就要用到反射的機制來檢查可用的方法並返回方法名。Java通過JavaBeans提供了基於構件的編程架構。


第二種情況,在運行時獲取類的信息的另外一個動機,就是希望能夠提供在跨網路的遠程平台上創建和運行對象的能力。這被成為遠程調用(RMI),它允許一個Java程序將對象分步在多台機器上,雲南java培訓http://www.kmbdqn.com/認為這種分步能力將幫助開發人員執行一些需要進行大量計算的任務,充分利用計算機資源,提高運行速度。


㈢ 什麼是反射什麼Java反射

java反射是什麼意思呢?下面帶大家了解一下。
JAVA反射是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。反射是一種強大的工具,能夠創建靈活的代碼,可以使代碼在運行時裝配,無需在組件之間進行源代表鏈接。
JAVA反射機制是在運行狀態中,知道所有屬性和方法,對於任意一個對象,能夠調用它的方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能的反射機制。
反射適合用在哪

首先我們先思考一個問題,反射適合使用在哪裡呢?從功能上看,反射似乎無所不能,幾乎所有的類,所有的屬性、方法、構造我們都能使用,但是我們細細思考一下,在實際開發中,並不是所有場景都需要使用反射獲取屬性或者方法進行操作,反而更多的使用實例.xxx方式操作,而當這些操作重復次數較多的時候,我們往往會考慮優化代碼,減少代碼冗餘,提高復用,比如實體構建賦值等操作,這個時候往往是我們最需要復用的地方,所以我們可以大體認為反射主要使用在實體操作過程中。而在一般操作數據的過程中,我們的實體一般都是知道並且依賴於對應的數據類型的,比如:
1.根據類型new的方式創建對象
2.根據類型定義變數,類型可能是基本類型也可能是引用類型、類或者介面
3.將對應類型的對象傳遞給方法
4.根據類型訪問對象的屬性,調用方法等操作
以上這些操作都是數據操作的過程中最常見也是最難復用優化的地方,而如果這里的操作使用反射則可以實現動態的操作不同的類型的實例,通過調用反射入口類Class,獲取對應的屬性、構造、方法完成對應的操作

㈣ java 基本類型 能否通過反射得到

基本數據類型都是可以反射的,你的clazz有個isPrimitive()方法,就是用來表示這個反射的位元組碼是不是基本類型,沒有構造方法只是說明這個基本類型的位元組碼本來就沒有構造方法,
這種基本類型的反射一般可以通過包裝類來識別,像 int.class == Integer.TYPE; boolean.class == Boolean.TYPE,另外void 都可以反射呢,void.class == Void.TYPE

㈤ 如何用java的反射實現動態強制類型轉換~~

(Cast) 方式本來就是編譯時的靜態轉換,你既然已經在runtime得到TestImpl的具體對象,那就直接使用好了,runtime的時候某個對象是什麼類型就已經確定了,不存在類型轉換。

㈥ java 反射 數據類型轉換

給你一段屬性反射的代碼,你自己看著改吧

Field[]fs=userCla.getDeclaredFields();
for(inti=0;i<fs.length;i++){
Fieldf=fs[i];
f.setAccessible(true);//設置些屬性是可以訪問的
Objectval=f.get(bean);//得到此屬性的值

System.out.println("name:"+f.getName()+" value="+val);

Stringtype=f.getType().toString();//得到此屬性的類型
if(type.endsWith("String")){
System.out.println(f.getType()+" 是String");
f.set(bean,"12");//給屬性設值
}elseif(type.endsWith("int")||type.endsWith("Integer")){
System.out.println(f.getType()+" 是int");
f.set(bean,12);//給屬性設值
}else{
System.out.println(f.getType()+" ");
}

}

基本就是getType()之後,根據type的類型來反射

㈦ 曲靖電腦培訓學校告訴你Java的反射機制

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

  1. 升級jdk了吧?

  2. 類型更加嚴格了,仔細檢查一下吧。

㈨ java,反射機制

你這個還不是反射,這個叫強制類型轉換。 因為己經知道myProxy.getProxy方法返回的類型肯定是 TargetInterface 類型,所以(TargetInterface)myProxy.getProxy肯定沒有問題。
同時,TargetInterface 繼承自 Object 所以編譯也是正確的。

那麼真正的反射是利用類的包名直接實例化出類的對象實例,以下是類反射的一個例子:
Class<?> cls= Class.forName(「com.app.TargetInterface」);
if(cls!=null){
try {
TargetInterface interface=(TargetInterface)cls.newInstance();
} catch (Exception e) {}
}

這樣,只要傳給一個字元串,就可以把一個類構建出對象來。
本例中構建出來的是採用該類的默認構造函數, 還可以指定構造器。
甚至利用類反射可以分析出類結構中所有的方法和屬性。

利用類反射機制可以製造計算機病毒。

具體更多的類反射知識可以詳見專門介紹此知識的書籍

㈩ java課程分享Java的反射機制

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

反射基礎


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


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


通過getClass方法


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


String s = "ziwenxie";


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


通過forName方法


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


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


使用.class


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


Class<?> c = String.class;


獲取類型信息


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


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


package typeinfo.interfacea;


public interface A { void f(); }


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


閱讀全文

與java反射類型轉換相關的資料

熱點內容
驍騎校全部小說順序 瀏覽:394
如何將iphone手機照片轉到安卓手機 瀏覽:31
從本地郵件到伺服器是什麼協議 瀏覽:226
外國片公交車男女主 瀏覽:234
瓦房店新瑪特有電影院嗎 瀏覽:933
免費觀看網頁版 瀏覽:622
葉子楣徐錦江演的電影 瀏覽:40
一級建造師法規pdf 瀏覽:496
phpshiro 瀏覽:161
無憂雲伺服器放行 瀏覽:634
免費最新大片觀看網址 瀏覽:250
微信手勢圖標加密 瀏覽:746
存儲伺服器能幹什麼 瀏覽:785
c編輯軟體怎麼編譯 瀏覽:597
hpc編譯器論文 瀏覽:814
javac編譯子目錄下所有文件 瀏覽:430
卡友幫幫團是什麼app 瀏覽:242
vnc啟動命令 瀏覽:374
哺乳十電影 瀏覽:629
貴州java編譯器 瀏覽:645