當前位置:首頁 » 編程軟體 » 反射會用到編譯優化嗎

反射會用到編譯優化嗎

發布時間: 2022-03-30 20:28:01

java中假如包文件很多的話,使用反射會不會降低效率

JAVA有句名言:沒有反射,就沒有JAVA。

JAVA的開發工具語言都大量使用反射。至於說到反射降低效率,都得在調用量單位級數在億級時,損耗才比較明顯。一般工程中,大可忽略。因為我們用到的JDK就是反射。底層就是這樣的。除非用C語言。呵呵 。

看看java的反射效率

java反射效率到底如何,花了點時間,做了一個簡單的測試.供大家參考.
測試背景:
1. 測試簡單Bean(int,Integer,String)的set方法
2. loop 1億次
3. 測試代碼盡可能避免對象的創建,復發方法的調用,僅僅測試set方法的耗時
測試結果:
場景 本機測試結果(XP,雙核,2G) 伺服器測試結果(Linux,XEN虛擬機,8核,5.5G)
方法直接調用 235MS 190MS

JDK Method調用 29188MS 4633MS

JDK Method調用
(稍作優化) 5672MS 4262MS

Cglib FastMethod
調用 5390MS 2787MS

得出一個感性的結果:
1.JDK反射效率是直接調用的一個數量級,差不多20倍
2.一個set方法的反射調用時間 = 4633ms / 1億 / 3次 = 0.0154us
3.Cglib的fastmethod還是有優勢的

❷ Java中的反射,一般什麼時候會用到

做基礎框架的時候會用得上,一般應用層面很少,不過這種東西,基本現在很多開源框架都已經給你封裝好了,自己基本用不著寫。典型的除了樓上講的Hibernate之外,其實Spring也用到了。經典的就是xml或者properties裡面寫上了配置,然後在Java類裡面解析xml或properties裡面的內容,得到一個字元串,然後用反射,根據這個字元串獲得某個類的實例,這樣就可以動態配置一些東西,不用每一次都要在代碼裡面去new或者做其他的事情,以後要改的話直接改配置文件,代碼維護起來就很方便了,同時有時候要適應某些需求,Java類裡面不一定能直接調用另外的方法,這時候也可以通過反射機制來實現。
總的來說,自己寫的很少,具體什麼時候要用那要看需求,樓上說得對,無非就是根據一個String來得到你要的實體對象,然後調用它原來的東西。但是如果是要自己寫框架的話,那就會用得比較多了。

❸ 請問JAVA的反射機制在工作中經常用到嗎

取決於的程序場景反射可以解決靜態編譯時不確定運行庫是否有某個API的情況;
比如android開發時,一個系統API是4.0以上SDK才有的,但是的程序需要在2.3以上版本運行;
那麼如果顯式的直接調用這個API,那麼就會編譯不通過;
這時使用反射機制就可以繞過靜態語言的編譯時檢查,等到運行時才做檢查;
可以認為是削弱系統耦合程度的一種方式;
所有的功能都是針對某些場景存在的,遇到了就有用,遇不到就沒用。

❹ Java的反射到底有什麼用途

反射的作用可謂是博大精深,

  1. JDK動態代理生成代理類的位元組碼後,首先把這個類通過defineclass定義成一個類,然後用class.for(name)會把該類載入到jvm,之後我們就可以通過,A.class.GetMethod()獲取其方法,然後通過invoke調用其方法,在調用這個方法時,實際上會通過被代理類的引用再去調用原方法。

  2. Java反射包reflection提供對Class,Method,field,constructor1 等信息的封裝類型

  3. 通過這些api可以輕易獲得一個類的各種信息並且可以進行實例化,方法調用等。
    類中的private參數可以通過setaccessible方法強制獲取。

❺ java反射究竟消耗多少效率

首先明確概念
String str = new String();
上面的String稱為『類』,str指向的目標稱為『實體』。到此無法理解的話,請溫習java面向對象的基礎後再往下閱讀。
反射實現的核心是Class類。運行時,每一個類都對應一個Class實體,利用這些實體完成反射行為。這些實體是在jvm進行類載入時完成創建的,不論是否有反射操作,所以和反射的開銷無關。

反射機制是對人來說的一種邏輯特徵,對計算機來說,和普通的方法調用沒有任何區別,所以在編譯階段的開銷差距不大,可能會更小(因為引包更少)。
java是強類型語言,反射能夠在使用上弱化這種『強』。正常的實體創建和方法調用,是通過地址直接調用的,而反射是通過字元串的匹配來定址,再按地址調用,中間多出一步定址。定址的開銷在執行實體內部方法以及靜態方法時和Map類的鍵值對定址開銷相同,基本可以忽略。構造方法稍微復雜一點,但差距也不大。
綜上,就本人考慮到的內容,反射相比直接調用,只增加了簡單幾步定址過程,不會對效率造成太大影響。

❻ java中的反射機制是什麼,有什麼作用啊

Method類中的方法的使用(含代碼和注釋):

getMethods()獲得本類及父類中的public許可權修飾**符方法
getDeclaredMethods()專門獲得調用該方法的對象的本類中的所有方法包括private許可權修飾符**的方法
getDeclaredMethod(Stringname,class<?>...parameterTypes)
第一個參數:方法的名稱
第二個參數:可變長度,寫你要查找的那個方法的參數類型列表.class
getParameterCount()得到方法的參數個數123456
packageLessonForReflection03;importjava.lang.reflect.Method;importjava.lang.reflect.Modifier;abstractclassCard{
privatevoidcreatRandomNumbers(intcount)//private關鍵字
{

}

publicvoidgetFullCardsNumbers(String[]random,Stringpre_numbers)
{

}

publicstaticvoidgetUserInfor()
{

}

(Stringtel);

(intsal1,intsal2),ArithmeticException;}publicclassMethodInforGetter{

publicstaticvoidmain(String[]args)
{
Class<?>c1=Card.class;

System.out.println("-------------------------");

Method[]m1=c1.getMethods();//getMethods()獲得本類及父類中的public方法!
for(Methodm:m1)
{
System.out.println(m);
}

System.out.println("-------------------------");

Method[]m2=c1.getDeclaredMethods();//getDeclaredMethods()專門獲得本類中的所有方法包括private!
for(Methodm:m2)
{
System.out.println(m);
}

System.out.println("-------------------------");

/*
*getDeclaredMethod(Stringname,class<?>...parameterTypes)
*第一個參數:方法的名稱
*第二個參數:可變長度,寫你要查找的那個方法的參數類型列表
*
*getParameterCount()得到方法的參數個數
*/

try
{
Methodm3=c1.getDeclaredMethod("getUserInfor");
System.out.println(m3);

//getParameterCount()方法,獲得方法參數個數
System.out.println(m3.getParameterCount());
System.out.println(Modifier.toString(m3.getModifiers()));//獲得方法修飾符
System.out.println(m3.getReturnType());

System.out.println("-------------------------");

Methodm4=c1.getDeclaredMethod("getUserInfor",int.class,int.class);

//getExceptionTypes()可以獲得初始化當前Method對象的給Class對象初始化的那個類的那個指定方法拋出的異常類型
Class<?>[]exception=m4.getExceptionTypes();
for(Class<?>e:exception)
{
System.out.println(e);
}

}catch(NoSuchMethodException|SecurityExceptione)
{
e.printStackTrace();
}
}}576777879808182838485868788

Constructor類中的方法的使用www.xiaoyuani.com(含代碼和注釋):

java.lang.reflect.Constructor:
Constructor[]getConstructor()獲得本類里的public許可權修飾符構造函數,不能獲取父類的!
Constructor[]getDeclaredConstructor()獲得本類中的所以構造函數!
Constructor<T>getConstructor(Class...parameterType)用參數決定獲得本類中的某個的構造方法,只能獲得public的
Constructor<T>getDeclaredConstructor(Class...parameterType)用參數決定獲得本類中的某個構造方法
附:
JDK8.0之後新增的類:
Executable:
它是Method和Constructor的父類
常用方法:
getParameter()獲得類中方法參數
getExceptionTypes()獲得類中某個方法拋出異常類型
getMoidfiers()獲得方法許可權修飾符
Parameter:
封裝並代表了參數實例123456789101112131415
packageLessonForReflection03;importjava.lang.reflect.Constructor;importjava.lang.reflect.Modifier;importjava.lang.reflect.Parameter;/*
*java.lang.reflect.Constructor
*
*Constructor[]getConstructor();獲得本類里的public許可權修飾符構造函數,不能獲取父類的
*Constructor[]getDeclaredConstructor();得本類里的全部構造
*
*Constructor<T>getConstructor(Class...parameterType);用參數決定獲得哪個構造方法
*Constructor<T>getDeclaredConstructor(Class...parameterType);
*
*/{
publicstaticvoidmain(String[]args)
{
System.out.println("獲得Cricle本類里的public許可權修飾符構造函數,不能獲取父類的Constructor[]getConstructor()");
System.out.println("子類繼承不了父類中的構造方法和private");
//Constructor[]getConstructor()獲得Cricle本類里的public許可權修飾符構造函數,不能獲取父類的
//子類繼承不了父類中的構造方法和private
Class<Circle>c1=Circle.class;
Constructor<?>[]cons1=c1.getConstructors();
for(Constructor<?>cons:cons1)
{
System.out.println(cons);
//System.out.println(cons.getName());
}

System.out.println("-----------------------");

System.out.println("方法獲得本類中的所有構造函數getDeclaredConstructor()");
Constructor<?>[]cons2=c1.getDeclaredConstructors();
for(Constructor<?>cons:cons2)
{
System.out.println(cons);
}

System.out.println("-----------------------");

try
{
System.out.println("方法用參數指定獲得本類!構造方法,只能獲取public的Constructor<T>getConstructor(Class...parameterType)");
Constructor<?>cons3=c1.getConstructor(int.class);
System.out.println(Modifier.toString(cons3.getModifiers()));
System.out.println(cons3);

System.out.println("-----------------------");

System.out.println("方法用參數指定獲得本類!構造方法任何許可權修飾符的都可以獲得Constructor<T>getDeclaredConstructor(Class...parameterType)");
Constructor<?>cons4=c1.getDeclaredConstructor(String.class);
System.out.println(cons4);

System.out.println("-----------------------");

/*
*JDK8.0之後新增的類
*Executable:
*是Method和Constructor的父類
*方法:
*getParameter();
*getExceptionTypes();
*getModifiers();
*getTypeParameters();
*
*Parameter:
*封裝並代表了參數實例
*/
System.out.println("獲取類中方法的參數getParameters()");
Constructor<?>cons5=c1.getDeclaredConstructor(int.class,String.class);
Parameter[]p1=cons5.getParameters();
for(Parameterp:p1)
{
System.out.println(p);
}
}catch(NoSuchMethodException|SecurityExceptione)
{
e.printStackTrace();
}

}}5767778798081828384858687

代碼中提到的Circle類和Shape類二者為繼承關系:

packageLessonForReflection03;publicclassCircleextendsShape{
privateintr;
privateStringcolor;

publicCircle(intr,Stringcolor)
{
super();
this.r=r;
this.color=color;
}

publicCircle(intr)
{
super();
this.r=r;
}

protectedCircle(Stringcolor)
{
super();
this.color=color;
}

Circle()
{
super();
}}
packageLessonForReflection03;publicclassShape{
privateintper;

publicShape(intper)
{
super();
this.per=per;
}

publicShape()
{
super();
}}1234567891011121314151617

部分文字來源於:
咕嘟咖啡楊海濱老師 — 《java編程語言高級特性》
輕量化研習Java相關技術倡導者
「愛碼學院」聯合創始人自適應教學理念提出者踐行者;多年開發及項目管理經歷;出版《JavaEE企業級應用與開發》一書;10餘年高校項目實踐畢設指導經驗;企業軟培經驗豐富

❼ Java用反射有什麼優點

一、反射機制

簡單的來說,反射機制指的是程序在運行時能夠獲取自身的信息。在java中,只要給定類的名字.那麼就可以通過反射機制來獲得類的所有信息。

二、用到反射機制

用過一些知識,但是並不知道專業術語是什麼,在剛剛學jdbc時用過一行代碼,Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那時候只知道那行代碼是生成 .驅動對象實例,並不知道具體含義。現在很多開
框架都用到反射機制,hibernate、struts都是用反射機制實現的。

三、反射機制的優點與缺點

靜態編譯:在編譯時確定類型,綁定對象,即通過。

動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多態的應用,有以降低類之間的藕合性。
一句話,反射機制的優點就是可以實現動態創建對象和編譯,體現出很大的靈活性,特別是在J2EE的開發中靈活性就表現的十分明顯。比如,一個大型的軟體,不可能一次就把把設計的很完美,當這個程序編譯後,發布了,當發現需要更新某些功能時,不可能要用戶把以前的卸載,再重新安裝新的版本,假如
這樣的話,這個軟體肯定是沒有多少人用的。採用靜態的話,需要把整個程序重新編譯一次才可以實現功能的更新,而採用反射機制的話,它就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現該功能。
缺點是對性能有影響。使用反射基本上是一種解釋操作,可以告訴JVM,我們希望做什麼並且滿足要求。這類操作總是慢於只直接執行相同的操作。

❽ JAVA中反射是什麼

JAVA中反射是動態獲取信息以及動態調用對象方法的一種反射機制。

Java反射就是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態語言的一個關鍵性質。

Java反射的功能是在運行時判斷任意一個對象所屬的類,在運行時構造任意一個類的對象,在運行時判斷任意一個類所具有的成員變數和方法,在運行時調用任意一個對象的方法,生成動態代理。

(8)反射會用到編譯優化嗎擴展閱讀:

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開發里反射有什麼作用,什麼時候會用到

反射一般的時候是用不到的,但是很重要,重要,重要!!!一般用到的都是底層框架,Spring,hibernate底層都有用到的,如果你什麼時候開發框架的時候說不定會用到

熱點內容
編程和技術 發布:2025-04-23 14:11:02 瀏覽:640
蘋果游戲部落沖突如何轉安卓 發布:2025-04-23 13:26:13 瀏覽:62
計算器的密碼多少 發布:2025-04-23 13:21:48 瀏覽:463
哪種腳本 發布:2025-04-23 13:11:48 瀏覽:76
java企業 發布:2025-04-23 13:11:04 瀏覽:85
秒拍上傳本地視頻 發布:2025-04-23 13:05:14 瀏覽:454
吃雞安卓區轉蘋果區需要休息什麼 發布:2025-04-23 13:03:12 瀏覽:907
編程速度 發布:2025-04-23 13:00:20 瀏覽:353
族譜網源碼 發布:2025-04-23 12:47:26 瀏覽:30
rsa演算法演算法c語言實現 發布:2025-04-23 12:45:14 瀏覽:936