java反射類
⑴ 能說一下java的反射機制嗎
反射:一個類有多個組成部分,例如:成員變數、方法、構造方法等
反射就是載入類,並解剖出類的各個組成部分
java中有一個Class類用於代表某一個類的位元組碼。Class類提供載入某個位元組碼的方法:forName()
forName方法用於載入某個類的位元組碼到內存中,並使用Class對象進行封裝
另外兩種得到Class對象的方式:
類名.class
對象。getClass()
SUN公司為簡化創建對象的方法,它在Class對象中也提供了一個newInstance方法,用於創建類的對象,這樣開發人員可以避免每次都需要去反射Constructor類以創建對象
不過需要注意的是,Class.newInstance方法內部是反射類無參的構造函數創建的對象,所以利用此種方式創建類對象時,類必須有一個無參的構造函數
總結如下:反射機制是開發框架時才運用到的技術
⑵ java反射機制的實現原理
反射機制就是java語言在運行時擁有一項自觀的能力。
通過這種能力可以徹底的了解自身的情況為下一步的動作做准備。
下面具體介紹一下java的反射機制。這里你將顛覆原來對java的理解。
Java的反射機制的實現要藉助於4個類:class,Constructor,Field,Method;
其中class代表的時類對象,
Constructor-類的構造器對象,
Field-類的屬性對象,
Method-類的方法對象。
通過這四個對象我們可以粗略的看到一個類的各個組成部分。
Class:程序運行時,java運行時系統會對所有的對象進行運行時類型的處理。
這項信息記錄了每個對象所屬的類,虛擬機通常使用運行時類型信息選擇正 確的方法來執行(摘自:白皮書)。
但是這些信息我們怎麼得到啊,就要藉助於class類對象了啊。
在Object類中定義了getClass()方法。我 們可以通過這個方法獲得指定對象的類對象。然後我們通過分析這個對象就可以得到我們要的信息了。
比如:ArrayList arrayList;
Class clazz = arrayList.getClass();
然後我來處理這個對象clazz。
當然了Class類具有很多的方法,這里重點將和Constructor,Field,Method類有關系的方法。
Reflection 是 Java 程序開發語言的特徵之一,它允許運行中的 Java 程序對自身進行檢查,或者說「自審」,並能直接操作程序的內部屬性。Java 的這一能力在實際應用中也許用得不是很多,但是個人認為要想對java有個更加深入的了解還是應該掌握的。
reflection的工作機制
考慮下面這個簡單的例子,讓我們看看 reflection 是如何工作的。
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
//forName("java.lang.String")獲取指定的類的對象
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}
按如下語句執行:
java DumpMethods java.util.ArrayList
這個程序使用 Class.forName 載入指定的類,然後調用 getDeclaredMethods 來獲取這個類中定義了的方法列表。java.lang.reflect.Methods 是用來描述某個類中單個方法的一個類。
Java類反射中的主要方法
對於以下三類組件中的任何一類來說
-- 構造函數、欄位和方法
-- java.lang.Class 提供四種獨立的反射調用,以不同的方式來獲得信息。調用都遵循一種標准格式。以下是用於查找構造函數的一組反射調用:
Constructor getConstructor(Class[] params) -- 獲得使用特殊的參數類型的公共構造函數,
Constructor[] getConstructors() -- 獲得類的所有公共構造函數
Constructor getDeclaredConstructor(Class[] params) -- 獲得使用特定參數類型的構造函數(與接入級別無關)
Constructor[] getDeclaredConstructors() -- 獲得類的所有構造函數(與接入級別無關)
獲得欄位信息的Class 反射調用不同於那些用於接入構造函數的調用,在參數類型數組中使用了欄位名:
Field getField(String name) -- 獲得命名的公共欄位
Field[] getFields() -- 獲得類的所有公共欄位
Field getDeclaredField(String name) -- 獲得類聲明的命名的欄位
Field[] getDeclaredFields() -- 獲得類聲明的所有欄位
用於獲得方法信息函數:
Method getMethod(String name, Class[] params) -- 使用特定的參數類型,獲得命名的公共方法
Method[] getMethods() -- 獲得類的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數類型,獲得類聲明的命名的方法
Method[] getDeclaredMethods() -- 獲得類聲明的所有方法
使用 Reflection:
用於 reflection 的類,如 Method,可以在 java.lang.relfect 包中找到。使用這些類的時候必須要遵循三個步驟:
第一步是獲得你想操作的類的 java.lang.Class 對象。
在運行中的 Java 程序中,用 java.lang.Class 類來描述類和介面等。
下面就是獲得一個 Class 對象的方法之一:
Class c = Class.forName("java.lang.String");
這條語句得到一個 String 類的類對象。還有另一種方法,如下面的語句:
Class c = int.class;
或者
Class c = Integer.TYPE;
它們可獲得基本類型的類信息。其中後一種方法中訪問的是基本類型的封裝類 (如 Intege ) 中預先定義好的 TYPE 欄位。
第二步是調用諸如 getDeclaredMethods 的方法,以取得該類中定義的所有方法的列表。
一旦取得這個信息,就可以進行第三步了——使用 reflection API 來操作這些信息,如下面這段代碼:
Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());
它將以文本方式列印出 String 中定義的第一個方法的原型。
處理對象:
a.創建一個Class對象
b.通過getField 創建一個Field對象
c.調用Field.getXXX(Object)方法(XXX是Int,Float等,如果是對象就省略;Object是指實例).
例如:
import java.lang.reflect.*;
import java.awt.*;
class SampleGet {
public static void main(String[] args) throws Exception {
Rectangle r = new Rectangle(100, 325);
printHeight(r);
printWidth( r);
}
static void printHeight(Rectangle r)throws Exception {
//Field屬性名
Field heightField;
//Integer屬性值
Integer heightValue;
//創建一個Class對象
Class c = r.getClass();
//.通過getField 創建一個Field對象
heightField = c.getField("height");
//調用Field.getXXX(Object)方法(XXX是Int,Float等,如果是對象就省略;Object是指實例).
heightValue = (Integer) heightField.get(r);
System.out.println("Height: " + heightValue.toString());
}
static void printWidth(Rectangle r) throws Exception{
Field widthField;
Integer widthValue;
Class c = r.getClass();
widthField = c.getField("width");
widthValue = (Integer) widthField.get(r);
System.out.println("Height: " + widthValue.toString());
}
}
⑶ Java的反射機制是什麼,如何實現
Java中的反射機制,通俗點解釋就是能夠在程序運行中動態獲取到內存中任一對象的信息,這些信息包括對象所屬類、類中的方法和屬性、以及它們的訪問控制域和返回值類型等等,還可以通過反射動態調用對象中的方法,而不管該方法的訪問域是私有或是公開,包括構造方法,還能實現動態代理等。總之,反射能夠破壞掉JAVA類本身的封裝性,進而獲取其私有的或公開的信息,也就能突破封裝進而調用私有的或公開的方法。
實現的話就是通過反射介面,JAVA把反射相關的類介面都封裝在了java.lang.reflect這個包中,你可以研究下這個包中的類,對於類的每一個屬性,如變數、方法,構造方法,這個包中都就與之相對應的類,通過這個類就可以操作這個屬性了。
java反射很強大,但也很危險,在實際開發中應少用或不用,在必要用之時,往往也能解決你遇到的問題。
⑷ 什麼叫java反射
Reflection(反射) 是Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等等)、superclass(例如Object)、實現interfaces(例如Serializable),也包括fields和methods的所有信息,並可於運行時改變fields內容或調用methods。
例如:
import java.lang.reflect.Method;
public class DumpMethods
{
public static void main(String[] args) throws Exception
{
Class<?> classType = Class.forName(args[0]);
Method[] methods = classType.getDeclaredMethods();
for(Method method : methods)
{
System.out.println(method);
}
}
}
⑸ Java鐨勫弽灝勬満鍒訛紵
Java鍙嶅皠鏈哄埗鏄涓涓闈炲父寮哄ぇ鐨勫姛鑳斤紝鍦ㄥ緢澶氬ぇ鍨嬮」鐩姣斿係pring,Mybatis閮藉彲浠ョ湅瑙佸弽灝勭殑韜褰便傞氳繃鍙嶅皠鏈哄埗鎴戜滑鍙浠ュ湪榪愯屾湡闂磋幏鍙栧硅薄鐨勭被鍨嬩俊鎮錛屽埄鐢ㄨ繖涓鐗規ф垜浠鍙浠ュ疄鐜板伐鍘傛ā寮忓拰浠g悊妯″紡絳夎捐℃ā寮忥紝鍚屾椂涔熷彲浠ヨВ鍐矹ava娉涘瀷鎿﹂櫎絳変護浜鴻嫤鎮肩殑闂棰樸備笅闈java璇劇▼灝變粠瀹為檯搴旂敤鐨勮掑害鍑哄彂錛屾潵搴旂敤涓涓婮ava鐨勫弽灝勬満鍒躲
鍙嶅皠鍩虹
p.s:鏈鏂囬渶瑕佽昏呭瑰弽灝勬満鍒剁殑API鏈変竴瀹氱▼搴︾殑浜嗚В錛屽傛灉涔嬪墠娌℃湁鎺ヨЕ榪囩殑璇濓紝寤鴻鍏堢湅涓涓嬪畼鏂規枃妗g殑QuickStart銆
鍦ㄥ簲鐢ㄥ弽灝勬満鍒朵箣鍓嶏紝棣栧厛鎴戜滑鍏堟潵鐪嬩竴涓嬪備綍鑾峰彇涓涓瀵硅薄瀵瑰簲鐨勫弽灝勭被Class錛屽湪Java涓鎴戜滑鏈変笁縐嶆柟娉曞彲浠ヨ幏鍙栦竴涓瀵硅薄鐨勫弽灝勭被銆
閫氳繃getClass鏂規硶
鍦↗ava涓錛屾瘡涓涓狾bject閮芥湁涓涓猤etClass鏂規硶錛岄氳繃getClass鏂規硶鎴戜滑鍙浠ヨ幏鍙栧埌榪欎釜瀵硅薄瀵瑰簲鐨勫弽灝勭被錛
Strings="ziwenxie";
Class<?>c=s.getClass();
閫氳繃forName鏂規硶
鎴戜滑涔熷彲浠ヨ皟鐢–lass綾葷殑闈欐佹柟娉昮orName錛
Class<?>c=Class.forName("java.lang.String");
浣跨敤.class
鎴栬呮垜浠涔熷彲浠ョ洿鎺ヤ嬌鐢.class錛
Class<?>c=String.class;
鑾峰彇綾誨瀷淇℃伅
鍦ㄦ枃絝犲紑澶存垜浠灝辨彁鍒板弽灝勭殑涓澶уソ澶勫氨鏄鍙浠ュ厑璁告垜浠鍦ㄨ繍琛屾湡闂磋幏鍙栧硅薄鐨勭被鍨嬩俊鎮錛屼笅闈㈡垜浠閫氳繃涓涓渚嬪瓙鏉ュ叿浣撶湅涓涓嬨
棣栧厛鎴戜滑鍦╰ypeinfo.interfacea鍖呬笅闈㈡柊寤轟竴涓鎺ュ彛A錛
packagetypeinfo.interfacea;
publicinterfaceA{voidf();}
鎺ョ潃鎴戜滑鍦╰ypeinfo.packageaccess鍖呬笅闈㈡柊寤轟竴涓鎺ュ彛C錛屾帴鍙C緇ф壙鑷鎺ュ彛A錛屽苟涓旀垜浠榪樺彟澶栧壋寤轟簡鍑犱釜鐢ㄤ簬嫻嬭瘯鐨勬柟娉曪紝娉ㄦ剰涓嬮潰鍑犱釜鏂規硶鐨勬潈闄愰兘鏄涓嶅悓鐨勩
⑹ JAVA中反射是什麼
JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。
Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。
(6)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中反射的三種方法是
第一種:通過forName()方法;
第二種:類.class;
第三種:對象.getClass()。
舉例如下:
package
test;
public class Demo{
public static void
main(){
Class<?> c1 = null;
Class<?> c2 =
null;
Class<?> c3 =
null;
//三種反射用實例化方式
try{
//最常用的一種形式
c1 =
Class.forName("test.X");
}catch(ClassNotFoundException
e){
e.printStackTrace();
}
//通過Object類中的方法實例化
c2
= new X().getClass();
//通過類.class實例化
c3 =
X.class;
System.out.println("類名:" + c1.getName());
//得到類名
System.out.println("類名:" + c2.getName());
//得到類名
System.out.println("類名:" + c3.getName());
//得到類名
}
}