java反射机制的简单使用和优缺点
生活随笔
收集整理的這篇文章主要介紹了
java反射机制的简单使用和优缺点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
java反射機制的使用
一、反射是什么?
JAVA反射機制是在運行狀態中,對于任意一個類,都能夠獲取這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取類信息以及動態調用對象內容就稱為java語言的反射機制。
二、反射的作用
- 在運行時判斷任意一個對象所屬的類;
- 在運行時構造任意一個類的對象;
- 在運行時判斷任意一個類所具有的成員變量和方法;
- 在運行時調用任意一個對象的方法;
三、反射的實現
我們知道,要使用一個類,就要先把它加載到虛擬機中,生成一個Class對象。這個class對象就保存了這個類的一切信息。
反射機制的實現,就是獲取這個Class對象,通過Class對象去訪問類、對象的元數據以及運行時的數據。
四、反射機制中使用的類
- java.lang.Class; 類的對象代表一個類的所有
- java.lang.reflect.Constructor; 類的對象代表構造函數
- java.reflect.Filed; 類的對象代表屬性
- java.lang.Method; 類的對象代表方法
- java.lang.Modifier; 類的對象代表修飾符
五、反射機制的使用
1、獲取Class對象的三種方式
//方式一:引用保存內存地址中堆中的對象 Class class = Class.forName(className); //方式二:java語言種任何一個java對象都有getclass方法 Class class = 對象名.getClass(); //方式三:java中每個類型都有class屬性 Class class = 對象名.class;2、通過class對象創建一個java象
Obiect obj = class.newInstance();3、在運行時,獲取自己的父類信息
Class<?> parentClass = class.getSuperClass(); String parentName = parentClass.getName(); //獲取父類多個接口 Class[] ins = parentClass.getInterfaces(); for(Class in :ins){System.out.println(in.getName()); }4、獲取類的全部方法存于一個數組中
//返回聲明的所有方法,包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法 Method[] ms = class.getDeclaredMethods(); //返回可被訪問的公共方法 Method[] ms = clazz.getMethods(); for(Method m : ms){//方法的返回值類型Class returnType = m.getReturnType();//得到類型的簡寫名稱System.out.println(returnType.getSimpleName());//方法名System.out.println(m.getName());//按照聲明順序返回 Class 對象的數組,這些對象描述了此 Method 對象所表示的方法的形參類型Class [] ParameterType = m.getParameterTypes(); }反編譯類的某個method方法
class Test{public boolean login(String name,String pwd){if("z".equals(name)&&"123".equals(pwd)){return true;}return false;}public void logout(){System.out.println("已退出");} }public static void main(String[] args) throws Exception {//獲取類Class c = Class.forName("Test");//獲取某個特定的方法,通過方法名加形參列表Method login = c.getDeclaredMethod("login",String.class,String.class);//通過反射機制執行login方法Object o = c.newInstance();//調用o對象的m方法,傳遞兩個參數將結果存放在reValue中Object reValue = login.invoke(o,"z","123");System.out.println(reValue);}5、獲取類的全部字段,存于一個數組中
// 取得本類已聲明的所有字段,包括私有的、保護的 Field[] fields = clazz.getDeclaredFields(); // 取得本類中可訪問的所有公共字段 Field[] fileds = clazz.getFields(); for(Field filed:fileds ){Class type = field.getType();//獲取類型的第一種方式System.out.println(type.getName());//獲取類型的第二種方式System.out.println(type.getSimpleName()); }反射某個類具體的某個Field
public static void main(String[] args) throws Exception{//獲取類Class c = Class.forName("User");//獲取id屬性Field idf = c.getDeclaredField("id");//獲取某個特定的屬性可以用來代替set..,get..Object o = c.newInstance();//打破封裝,導致java屬性不安全idf.setAccessible(true);idf.set(o,"001");System.out.println(idf.get(o));//001}6、獲取類的全部構造函數,存于一個數組中
Constructor[] cs = class.getDeclaredConstructors(); for(Constructor con : cs){//獲取修飾符System.out.println(Modifier.toString(con.getModifiers()));//獲取構造方法名System.out.println(c.getName());//構造方法的形式參數列表Class [] parameterTypes = con.getParameterTypes(); }獲取某個類的某個構造方法并創造一個對象
//寫的一個實體 class Customer{String name;int age;Customer(String name,int age){this.name = name;this.age=age;}public String toString(){return "Customer["+name+","+age+"]";} }class Test{public static void main(String[] args) throws Exception {//獲取類Class clazz = Class.forName("Customer");//獲取特定的構造方法Constructor con = clazz.getDeclaredConstructor(String.class,int.class);//創建對象Customer customer = (Customer)con.newInstance("zhangsan",90);System.out.println(customer);}}六、反射機制的優缺點
優點:
缺點:
使用反射基本上是一種解釋操作,用于字段和方法接入時要遠慢于直接代碼。因此Java反射機制主要應用在對靈活性和擴展性要求很高的系統框架上,普通程序不建議使用。
反射包括了一些動態類型,所以JVM無法對這些代碼進行優化。因此,反射操作的效率要比那些非反射操作低得多。我們應該避免在經常被 執行的代碼或對性能要求很高的程序中使用反射。
程序人員希望在源代碼中看到程序的邏輯,反射等繞過了源代碼的技術,因而會帶來維護問題。反射代碼比相應的直接代碼更復雜。
使用反射技術要求程序必須在一個沒有安全限制的環境中運行。如果一個程序必須在有安全限制的環境中運行,如Applet,那么這就是個問題了。
由于反射允許代碼執行一些在正常情況下不被允許的操作(比如訪問私有的屬性和方法),所以使用反射可能會導致意料之外的副作用--代碼有功能上的錯誤,降低可移植性。反射代碼破壞了抽象性,因此當平臺發生改變的時候,代碼的行為就有可能也隨著變化。
總結
以上是生活随笔為你收集整理的java反射机制的简单使用和优缺点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备案制有什么不好(备案制缺点)
- 下一篇: 对象集合中如何用对象的某个属性给对象排序