讀配置文件為什麼反射機制
❶ java反射機制的作用 及其它的好處
反射其實就是程序能夠自檢查自身信息。就像程序會照鏡子反光看自己。
在程序中可以檢查某個類中的方法屬性等信息,並且能夠動態調用。
這樣可以寫出很靈活的程序。
比如要把一個對象中的數據到另外一個對象中,規則是屬性名相同就,
就可以用反射來做,不需要指定每個屬性的名字,只要動態從類中取得信息,
再判斷屬性名是否相同即可。當然應用還有很多。
反射可以結合Java的位元組碼,使用ASM和cglib等庫,還能動態生成類。
hibernate的延遲載入,spring的AOP都是這么實現的
反射給Java帶來了一些動態性。不過雖然很好,但畢竟還是有一定局限性的。另外ASM,cglib使用還是不放便。因此一些純動態語言現在是一個重要發展趨勢,比如ruby,python等,程序很容易動態生成。
❷ java反射機制有什麼用
如果你是方法,快遞員是虛擬機。快遞員通過地址查地圖找你的叫反射調用。直接去找你的叫直接調用。反射很多地方在用,代碼編輯器智能提示就是反射的例子。
❸ 反射機制是怎樣的
在計算機科學領域,反射是指一類應用,它們能夠自描述和自控制。也就是說,這類應用通過採用某種機制來實現對自己行為的描述(self-representation)和監測(examination),並能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。
反射機制也被應用到了視窗系統、操作系統和文件系統中。 反射本身並不是一個新概念,它可能會使我們聯想到光學中的反射概念,盡管計算機科學賦予了反射概念新的含義,但是,從現象上來說,它們確實有某些相通之處,這些有助於我們的理解。同一般的反射概念相比,計算機科學領域的反射不單單指反射本身,還包括對反射結果所採取的措施。所有採用反射機制的系統(即反射系統)都希望使系統的實現更開放。可以說,實現了反射機制的系統都具有開放性,但具有開放性的系統並不一定採用了反射機制,開放性是反射系統的必要條件。一般來說,反射系統除了滿足開放性條件外還必須滿足原因連接(Causally-connected)。所謂原因連接是指對反射系統自描述的改變能夠立即反映到系統底層的實際狀態和行為上的情況,反之亦然。開放性和原因連接是反射系統的兩大基本要素。
Java中,反射是一種強大的工具。它使您能夠創建靈活的代碼,這些代碼可以在運行時裝配,無需在組件之間進行源代表鏈接。反射允許我們在編寫與執行時,使我們的程序代碼能夠接入裝載到JVM中的類的內部信息,而不是源代碼中選定的類協作的代碼。這使反射成為構建靈活的應用的主要工具。但需注意的是:如果使用不當,反射的成本很高。
❹ java框架中配置文件,映射到哪裡,用的是不是反射機制
反射機制可以這么理解:每一個對象實例都是由一個類派生出來的,這些類里有各種field(各種變數),constructor 和 method,那如果在運行時單單給你一個對象實例,你怎麼得知這個類的各種屬性(field,constructor,method)呢?那就反向從對象實例來取得自身的原生類,再根據這個類來取得它本身含有的各種屬性,然後就可以在運行時使用各種屬性了。
對象實例 變數,構造函數,函數
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
-----------------------------
Class
把Class(原生類)比作一面鏡子,看上圖是不是很像反射?所以這就叫反射機制。
❺ java 反射在哪裡使用
一般是在讀取配置文件的時候使用,比如在配置文件中定義了類名和方法名,要通過反射機制來找到對應的類和方法。
❻ java中的反射機制是什麼有什麼作用呢求解,謝謝。
Java反射機制詳解
1. 反射機制是什麼
反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
2. 反射機制能做什麼
反射機制主要提供了以下功能:
在運行時判斷任意一個對象所屬的類;
在運行時構造任意一個類的對象;
在運行時判斷任意一個類所具有的成員變數和方法;
在運行時調用任意一個對象的方法;
生成動態代理。
3. 反射機制的相關API
通過一個對象獲得完整的包名和類名
packagenet.xsoftlab.ke;
publicclassTestReflect{
publicstaticvoidmain(String[]args)throwsException{
TestReflecttestReflect=newTestReflect();
System.out.println(testReflect.getClass().getName());
//結果net.xsoftlab.ke.TestReflect
}
}
實例化Class類對象
packagenet.xsoftlab.ke;
publicclassTestReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>class1=null;
Class<?>class2=null;
Class<?>class3=null;
//一般採用這種形式
class1=Class.forName("net.xsoftlab.ke.TestReflect");
class2=newTestReflect().getClass();
class3=TestReflect.class;
System.out.println("類名稱"+class1.getName());
System.out.println("類名稱"+class2.getName());
System.out.println("類名稱"+class3.getName());
}
}
獲取一個對象的父類與實現的介面
packagenet.xsoftlab.ke;
importjava.io.Serializable;
{
=-2862585049955236662L;
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Class.forName("net.xsoftlab.ke.TestReflect");
//取得父類
Class<?>parentClass=clazz.getSuperclass();
System.out.println("clazz的父類為:"+parentClass.getName());
//clazz的父類為:java.lang.Object
//獲取所有的介面
Class<?>intes[]=clazz.getInterfaces();
System.out.println("clazz實現的介面有:");
for(inti=0;i<intes.length;i++){
System.out.println((i+1)+":"+intes[i].getName());
}
//clazz實現的介面有:
//1:java.io.Serializable
}
}
獲取某個類中的全部構造函數 - 詳見下例
通過反射機制實例化一個類的對象
packagenet.xsoftlab.ke;
importjava.lang.reflect.Constructor;
publicclassTestReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>class1=null;
class1=Class.forName("net.xsoftlab.ke.User");
//第一種方法,實例化默認構造方法,調用set賦值
Useruser=(User)class1.newInstance();
user.setAge(20);
user.setName("Rollen");
System.out.println(user);
//結果User[age=20,name=Rollen]
//第二種方法取得全部的構造函數使用構造函數賦值
Constructor<?>cons[]=class1.getConstructors();
//查看每個構造方法需要的參數
for(inti=0;i<cons.length;i++){
Class<?>clazzs[]=cons[i].getParameterTypes();
System.out.print("cons["+i+"](");
for(intj=0;j<clazzs.length;j++){
if(j==clazzs.length-1)
System.out.print(clazzs[j].getName());
else
System.out.print(clazzs[j].getName()+",");
}
System.out.println(")");
}
//結果
//cons[0](java.lang.String)
//cons[1](int,java.lang.String)
//cons[2]()
user=(User)cons[0].newInstance("Rollen");
System.out.println(user);
//結果User[age=0,name=Rollen]
user=(User)cons[1].newInstance(20,"Rollen");
System.out.println(user);
//結果User[age=20,name=Rollen]
}
}
classUser{
privateintage;
privateStringname;
publicUser(){
super();
}
publicUser(Stringname){
super();
this.name=name;
}
publicUser(intage,Stringname){
super();
this.age=age;
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
@Override
publicStringtoString(){
return"User[age="+age+",name="+name+"]";
}
}
獲取某個類的全部屬性
packagenet.xsoftlab.ke;
importjava.io.Serializable;
importjava.lang.reflect.Field;
importjava.lang.reflect.Modifier;
{
=-2862585049955236662L;
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Class.forName("net.xsoftlab.ke.TestReflect");
System.out.println("===============本類屬性===============");
//取得本類的全部屬性
Field[]field=clazz.getDeclaredFields();
for(inti=0;i<field.length;i++){
//許可權修飾符
intmo=field[i].getModifiers();
Stringpriv=Modifier.toString(mo);
//屬性類型
Class<?>type=field[i].getType();
System.out.println(priv+""+type.getName()+""+field[i].getName()+";");
}
System.out.println("==========實現的介面或者父類的屬性==========");
//取得實現的介面或者父類的屬性
Field[]filed1=clazz.getFields();
for(intj=0;j<filed1.length;j++){
//許可權修飾符
intmo=filed1[j].getModifiers();
Stringpriv=Modifier.toString(mo);
//屬性類型
Class<?>type=filed1[j].getType();
System.out.println(priv+""+type.getName()+""+filed1[j].getName()+";");
}
}
}
通過反射機制調用某個類的方法
packagenet.xsoftlab.ke;
importjava.lang.reflect.Method;
publicclassTestReflect{
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Class.forName("net.xsoftlab.ke.TestReflect");
//調用TestReflect類中的reflect1方法
Methodmethod=clazz.getMethod("reflect1");
method.invoke(clazz.newInstance());
//Java反射機制-調用某個類的方法1.
//調用TestReflect的reflect2方法
method=clazz.getMethod("reflect2",int.class,String.class);
method.invoke(clazz.newInstance(),20,"張三");
//Java反射機制-調用某個類的方法2.
//age->20.name->張三
}
publicvoidreflect1(){
System.out.println("Java反射機制-調用某個類的方法1.");
}
publicvoidreflect2(intage,Stringname){
System.out.println("Java反射機制-調用某個類的方法2.");
System.out.println("age->"+age+".name->"+name);
}
}
通過反射機制操作某個類的屬性
packagenet.xsoftlab.ke;
importjava.lang.reflect.Field;
publicclassTestReflect{
privateStringproprety=null;
publicstaticvoidmain(String[]args)throwsException{
Class<?>clazz=Class.forName("net.xsoftlab.ke.TestReflect");
Objectobj=clazz.newInstance();
//可以直接對private的屬性賦值
Fieldfield=clazz.getDeclaredField("proprety");
field.setAccessible(true);
field.set(obj,"Java反射機制");
System.out.println(field.get(obj));
}
}
4. 反射機制的應用實例
在泛型為Integer的ArrayList中存放一個String類型的對象。
packagenet.xsoftlab.ke;
importjava.lang.reflect.Method;
importjava.util.ArrayList;
publicclassTestReflect{
publicstaticvoidmain(String[]args)throwsException{
ArrayList<Integer>list=newArrayList<Integer>();
Methodmethod=list.getClass().getMethod("add",Object.class);
method.invoke(list,"Java反射機制實例。");
System.out.println(list.get(0));
}
}
通過反射取得並修改數組的信息
packagenet.xsoftlab.ke;
importjava.lang.reflect.Array;
publicclassTestReflect{
publicstaticvoidmain(String[]args)throwsException{
int[]temp={1,2,3,4,5};
Class<?>demo=temp.getClass().getComponentType();
System.out.println("數組類型:"+demo.getName());
System.out.println("數組長度"+Array.getLength(temp));
System.out.println("數組的第一個元素:"+Array.get(temp,0));
Array.set(temp,0,100);
System.out.println("修改之後數組第一個元素為:"+Array.get(temp,0));
}
}
將反射機制應用於工廠模式
packagenet.xsoftlab.ke;
interfacefruit{
publicabstractvoideat();
}
classAppleimplementsfruit{
publicvoideat(){
System.out.println("Apple");
}
}
classOrangeimplementsfruit{
publicvoideat(){
System.out.println("Orange");
}
}
classFactory{
publicstaticfruitgetInstance(StringClassName){
fruitf=null;
try{
f=(fruit)Class.forName(ClassName).newInstance();
}catch(Exceptione){
e.printStackTrace();
}
returnf;
}
}
/**
*對於普通的工廠模式當我們在添加一個子類的時候,就需要對應的修改工廠類。當我們添加很多的子類的時候,會很麻煩。
*Java工廠模式可以參考
*http://ke.xsoftlab.net/view/java-factory-pattern
*
*現在我們利用反射機制實現工廠模式,可以在不修改工廠類的情況下添加任意多個子類。
*
*但是有一點仍然很麻煩,就是需要知道完整的包名和類名,這里可以使用properties配置文件來完成。
*
*java讀取properties配置文件的方法可以參考
*http://ke.xsoftlab.net/view/java-read-the-properties-configuration-file
*
*@authorxsoftlab.net
*/
publicclassTestReflect{
publicstaticvoidmain(String[]args)throwsException{
fruitf=Factory.getInstance("net.xsoftlab.ke.Apple");
if(f!=null){
f.eat();
}
}
}
我有一個微信公眾號,經常會分享一些Java技術相關的干貨,還有一些學習資源。
如果你喜歡我的分享,可以用微信搜索「Java團長」或者「javatuanzhang」關注。
❼ java的反射機制原理和作用
反射機制是為了提高程序的擴展性,你需要在制定配置文件中寫入配置信息(類的擴展名.路徑等等),java虛擬機會根據你指定的路徑尋找指定擴展名的.java文件,載入到內存形成位元組碼文件,
tomcat伺服器運用的就是反射,它的配置文件時web.xml,
作用:就像tomcat伺服器,開發 這個伺服器的公司根本不知道你想把什麼網站放在tomcat上運行,所以它提供了web.xml文件,你只需要把你想在tomcat伺服器上的網站代碼文件名/路徑按照指定格式寫入web.xml文件.它就會自動運行.
建議:會用就可以了,反射機制就用到了方法不多,有java基礎的話一個多小時就可以掌握.
❽ java反射機制有什麼用
增加程序的靈活性。
如struts中。請求的派發控制。
當請求來到時。struts通過查詢配置文件。找到該請求對應的action。已經方法。
然後通過反射實例化action。並調用響應method。
如果不適用反射,那麼你就只能寫死到代碼里了。
所以說,一個靈活,一個不靈活。
很少情況下是非用反射不可的。大多數情況下反射是為了提高程序的靈活性。
因此一般框架中使用較多。因為框架要適用更多的情況。對靈活性要求較高。
❾ 關於JAVA 反射機制誰能描述清楚其實質性的作用
通過反射機制實例化這個類,是使用描述這個類的一個字元串來實例化它的對象。
如果直接用 new 關鍵字實例化,你就要在寫程序的時候,寫死要實例化的是哪個類的對象。
通過反射機制,就可以有一個配置文件讀取要實例化的類的描述字元串,可以是xml也可以是文本文件。 這樣用戶改變了配置文件中的字元串,就能讓你的程序在運行的時候去實例化不同的類的實例。
就比如spring的AOP就是用這個反射機制實現的。。
上面我說這個只是舉一個反射的應用例子,告訴你它不是「脫了褲子放屁」,它是真的有用。
其實它還有挺多場景的應用,不一一列舉。。
❿ JAVA中反射是什麼
JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。
Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。
Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。
(10)讀配置文件為什麼反射機制擴展閱讀:
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反射機制