① 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培訓認為這種分步能力將幫助開發人員執行一些需要進行大量計算的任務,充分利用計算機資源,提高運行速度。
② 如何用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 基本類型 能否通過反射得到
基本數據類型都是可以反射的,你的clazz有個isPrimitive()方法,就是用來表示這個反射的位元組碼是不是基本類型,沒有構造方法只是說明這個基本類型的位元組碼本來就沒有構造方法,
這種基本類型的反射一般可以通過包裝類來識別,像 int.class == Integer.TYPE; boolean.class == Boolean.TYPE,另外void 都可以反射呢,void.class == Void.TYPE
⑤ java反射提基本類型
Class.forName("java.lang.Integer");
int 的封裝類.
⑥ java怎麼通過反射得到屬性的類型
Class<?>cls=Class.forName(className);//通過類的名稱反射類
Objectobj=cls.newInstance();//對象實例化
Fieldfield=cls.getField(fieldName);//這個對應的是屬性
fieldValue=field.get(obj);//這個就是屬性的值
⑦ Java反射,通過反射添加元素報類型轉換錯誤
默認是會檢查類型的,你要這樣設置:obj.setAccessible(true)
⑧ java反射提基本類型
使用類字面常量或TYPE欄位,例如:
Class myObjectClass= MyObject.class;(類字面常量不僅可以應用於普通的類,也可以應用
於介面、數組以及基本數據類型),這種方式不僅更簡單,而且更安全,因為它在編譯時就會受到檢查,並且根除了對forName方法的調用,所以也更高效,建議使用「.class」的形式。
Class c = Integer.TYPE;(TYPE是基本數據類型的包裝類型的一個標准欄位,它是一
個引用,指向對應的基本數據類型的Class對象),附表如下,兩邊等價:
boolean.class
Boolean.TYPE
char.class
Character.TYPE
byte.class
Byte.TYPE
short.class
Short.TYPE
int.class
Integer.TYPE
long.class
Long.TYPE
float.class
Float.TYPE
double.class
Double.TYPE
void.class
Void.TYPE
⑨ 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反射調用int類型方法
int是基礎類型,不是java對象。所以java提供了包裝類型Integer,隱散提供了一些常用的方法。
所以要用反射不能調用int類型的方法,只能調用Integer的。
要用反射調用Integer的方法,首先要獲取Integer的class對象,通過碰攜譽class對象,獲取類
的屬性、方法,並笑段調用。