java反射
㈠ java反射問題
代碼如下:
importjava.lang.reflect.Field;
importjava.util.Scanner;
classStudent{
privateStringname;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
@Override
publicStringtoString(){
return"Student[name="+name+"]";
}
}
publicclassApp{
publicstaticvoidmain(String[]args)throwsException{
Scannerscanner=newScanner(System.in);
StringpackageName="com..demo042.";
StringclassName=scanner.nextLine();
Classclazz=Class.forName(packageName+className);
System.out.println(clazz);
Objectstu=clazz.newInstance();
System.out.println(stu);
Fieldfield=clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(stu,"Tom");
System.out.println(stu);
scanner.close();
}
}
運行結果:
㈡ java反射應用有哪些
Reflection(反射) 是 Java 程序開發語言的特徵之一,它允許運行中(注意是運行時,而非編譯時)的 Java 程序對自身進行檢查,或者說「自審」,並能直接操作程序的內部屬性。例如,使用它能獲得 Java 類中各成員的名稱並顯示出來,能夠通過字元串形式的類名稱(包括完整包名)反射性地創建類的實例,能夠動態執行類方法等。JavaBean 是 reflection 的實際應用之一,它能讓一些工具可視化的操作軟體組件。這些工具通過 reflection 動態的載入並取得 Java 組件(類) 的屬性。Java反射是動態程序設計的基礎。Java語言反射提供一種動態鏈接程序組件的多功能方法。它允許程序創建和控制任何類的對象,無需提前硬編碼目標類。這些特性使得反射特別適用於創建以非常普通的方式與對象協作的庫。Java reflection 非常有用,它使類和數據結構能按名稱動態檢索相關信息,並允許在運行著的程序中操作這些信息。Java 的這一特性非常強大,並且是其它一些常用語言,如 C、C++、Fortran 或者 Pascal 等都不具備的。 但反射有兩個缺點。第一個是性能問題。用於欄位和方法接入時反射要遠慢於直接代碼。性能問題的程度取決於程序中是如何使用反射的。如果它作為程序運行中相對很少涉及的部分,緩慢的性能將不會是一個問題。即使測試中最壞情況下的計時圖顯示的反射操作只耗用幾微秒。僅反射在性能關鍵的應用的核心邏輯中使用時性能問題才變得至關重要。 我最近使用反射寫了一個Pojo(實體)基類,你可以到我的Csdn博客上查閱該常式。文章地址為: http://blog.csdn.net/CodingMouse/archive/2009/04/11/4064007.aspx
㈢ java反射的作用。
1.可以通過反射機制發現對象的類型,發現類型的方法/屬性/構造器
2.可以創建對象並訪問任意對象方法和屬性
㈣ Java反射問題
按照你的要求編寫的用反射調用test方法的Java程序如下
Outter.java文件
public class Outter {
private Inner in;
public Outter(){
in=new Inner();
}
private class Inner {
private void test(){
System.out.println("test");
}
}
}
㈤ Java反射問題
類反射Class c = Class.forName("DynTest");Object obj =c.newInstance();
屬性反射Field f = c.getField("d");
方法反射Method m = c.getMethod("func",String.class);
JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
㈥ 什麼是反射什麼Java反射
java反射是什麼意思呢?下面帶大家了解一下。
JAVA反射是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。反射是一種強大的工具,能夠創建靈活的代碼,可以使代碼在運行時裝配,無需在組件之間進行源代表鏈接。
JAVA反射機制是在運行狀態中,知道所有屬性和方法,對於任意一個對象,能夠調用它的方法和屬性,這種動態獲取的信息以及動態調用對象的方法的功能的反射機制。
反射適合用在哪
首先我們先思考一個問題,反射適合使用在哪裡呢?從功能上看,反射似乎無所不能,幾乎所有的類,所有的屬性、方法、構造我們都能使用,但是我們細細思考一下,在實際開發中,並不是所有場景都需要使用反射獲取屬性或者方法進行操作,反而更多的使用實例.xxx方式操作,而當這些操作重復次數較多的時候,我們往往會考慮優化代碼,減少代碼冗餘,提高復用,比如實體構建賦值等操作,這個時候往往是我們最需要復用的地方,所以我們可以大體認為反射主要使用在實體操作過程中。而在一般操作數據的過程中,我們的實體一般都是知道並且依賴於對應的數據類型的,比如:
1.根據類型new的方式創建對象
2.根據類型定義變數,類型可能是基本類型也可能是引用類型、類或者介面
3.將對應類型的對象傳遞給方法
4.根據類型訪問對象的屬性,調用方法等操作
以上這些操作都是數據操作的過程中最常見也是最難復用優化的地方,而如果這里的操作使用反射則可以實現動態的操作不同的類型的實例,通過調用反射入口類Class,獲取對應的屬性、構造、方法完成對應的操作
㈦ java反射機制的高手請進!!!!
for(Method m:me)在Thinking in java中稱為Java中foreach循環
Method為類型信息 m為對象引用 me是一組對象集...
m.invoke()通過這個方法--反射私有方法
m.getName()就是你類的所有方法中的一個方法名
不懂Hi我!雖然我經常不在線...哈哈!!!
㈧ Java反射的幾個方法區別
1. 通過Object類的getClass方法來獲取
java.lang.Object中定義有getClass方法:public final Class getClass()
所有Java對象都具備這個方法,該方法用於返回調用該方法的對象的所屬類關聯的Class對象,例如:
Date date1 = new Date();
Date date2 = new Date();
Class c1 = date1.getClass();
Class c2 = date2.getClass();
System.out.println(c1.getName());
// java.util.Date
System.out.println(c1 == c2);
// true
上面的代碼中,調用Date對象date1的getClass方法將返回用於封裝Date類信息的Class對象。
這里調用了Class類的getName方法:public String getName(),這個方法的含義很直觀,即返回所封裝的類的名稱。
需要注意的是,代碼中的date1和date2的getClass方法返回了相同的Class對象(c1==c2的值為true)。這是因為,對於相同的類,JVM只會載入一次,而與該類對應的Class對象也只會存在一個,無論該類實例化了多少對象。
另外,需要強調的是,當一個對象被其父類的引用或其實現的介面類型的引用所指向時,getClass方法返回的是與對象實際所屬類關聯的Class對象。例如:
List list = new ArrayList();
System.out.println(list.getClass().getName()); // java.util.ArrayList
上面的代碼中,語句list.getClass()方法返回的是list所指向對象實際所屬類java.util.ArrayList對應的 Class對象而並未java.util.List所對應的Class對象。有些時候可以通過這個方法了解一個對象的運行時類型,例如:
HashSet set = new HashSet();
Iterator it = set.iterator();
System.out.println(it.getClass().getName()); //java.util.HashMap$KeyIterator
從代碼可以看出,HashSet的iterator方法返回的是實現了Iterator介面的HashMap內部類(KeyIterator)對象。
因為抽象類和介面不可能實例化對象,因此不能通過Object的getClass方法獲得與抽象類和介面關聯的Class對象。
2. 使用.class的方式
使用類名加「.class」的方式即會返回與該類對應的Class對象。例如:
Class clazz = String.class;
System.out.println(clazz.getName()); // java.lang.String
這個方法可以直接獲得與指定類關聯的Class對象,而並不需要有該類的對象存在。
3. 使用Class.forName方法
Class有一個著名的static方法forName:public static Class forName(String className) throws ClassNotFoundException
該方法可以根據字元串參數所指定的類名獲取與該類關聯的Class對象。如果該類還沒有被裝入,該方法會將該類裝入JVM。
該方法聲明拋出ClassNotFoundException異常。顧名思義,當該方法無法獲取需要裝入的類時(例如,在當前類路徑中不存在這個類),就會拋出這個異常。
㈨ java反射怎麼實現的
Java中反射有如下幾種實現方式:
1、通過Class.forName()方法載入字元串,就可以得到該字元串做代表的Class對象。
2、通過類名調用class屬性得到該類的Class對象。
例如:Class<?> clazz = String.class也可以得到String類的Class對象。
3、調用實例的getClass()方法。
例如:Date date = new Date();
Class<?> clazz = date.getClass();
通過上邊的兩句代碼就可以得到date實例的Class對象。
㈩ java反射
Class 類的實例表示正在運行的 Java 應用程序中的類和介面。枚舉是一種類,注釋是一種介面。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共享該 Class 對象。基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也表示為 Class 對象。
Class 沒有公共構造方法。Class 對象是在載入類時由 Java 虛擬機以及通過調用類載入器中的 defineClass 方法自動構造的。
以下示例使用 Class 對象來顯示對象的類名:
void printClassName(Object obj) {
System.out.println("The class of " + obj +
" is " + obj.getClass().getName());
}
還可以使用一個類字面值來獲得命名類型(或 void)的 Class 對象。例如:
System.out.println("The name of class Foo is: "+Foo.class.getName());