摘要:有一個參數的構造方法姓名有多個參數的構造方法姓名年齡這的執行效率有問題,以后解決。私有構造方法私有的構造方法年齡反射獲取對象的三種方式通過對象名方法獲取通過類名方式獲得通過方法獲得在運行期間,一個類,只有一個對象產生。
原文地址
反射簡單來說,就是動態加載對象,并對對象進行剖析。在Java中的反射機制是指在運行狀態中,對于任意一個類,都能夠知道并獲取這個類的所有屬性和方法。
Java反射機制的作用:在運行時判斷任意一個對象所屬的類。
在運行時判斷任意一個類所具有的成員變量和方法。
在運行時任意調用一個對象的方法
在運行時構造任意一個類的對象
反射機制的優缺點是什么?反射機制的優點就是可以實現動態創建對象和編譯,體現出很大的靈活性。
它的缺點是對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它
滿足我們的要求。這類操作總是慢于只直接執行相同的操作。
package com.gyl; public class Student { public int no; public String sex; private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } /* * 構造方法 */ Student(String str){ System.out.println("(默認)的構造方法 s = " + str); } //無參構造方法 public Student(){ System.out.println("調用了公有、無參構造方法執行了。。。"); } //有一個參數的構造方法 protected Student(char name){ System.out.println("姓名:" + name); } //有多個參數的構造方法 public Student(String name ,int age){ System.out.println("姓名:"+name+"年齡:"+ age);//這的執行效率有問題,以后解決。 } //私有構造方法 private Student(int age){ System.out.println("私有的構造方法 年齡:"+ age); } }
package com.gyl; import java.lang.reflect.Constructor; public class Main { public static void main(String[] args) throws ClassNotFoundException { Student student = new Student(); /* * JAVA反射--獲取Class對象的三種方式 */ // 通過對象名.getClass()方法獲取 Class stuClass = student.getClass(); System.out.println("stuClass is "+stuClass.getName()); // 通過類名.class方式獲得 Class stuClass1 = Student.class; System.out.println("stuClass1 is "+stuClass1.getName()); System.out.println(stuClass == stuClass1); // 通過Class.forName()方法獲得 Class stuClass2 = Class.forName("com.gyl.Student"); System.out.println("stuClass2 is "+stuClass2); System.out.println(stuClass1 == stuClass2); } } Output: stuClass is com.gyl.Student stuClass1 is com.gyl.Student true stuClass2 is class com.gyl.Student true
在運行期間,一個類,只有一個Class對象產生。三種方式常用第三種,第一種對象都有了還要反射干什么。第二種需要導入類的包,依賴太強,不導包就拋編譯錯誤。一般都選第三種,一個字符串可以傳入也可寫在配置文件中等多種方法。反射API 獲取構造方法
// 返回指定參數類型 public的構造器。 ConstructorgetConstructor(類>... parameterTypes) // 返回指定參數類型的構造器(public, protected, private)。 Constructor getDeclaredConstructor(類>... parameterTypes) // 返回所有的public類型的構造器 Constructor>[] getConstructors() // 返回所有的構造器 Constructor>[] getDeclaredConstructors()
package com.gyl; import java.lang.reflect.Constructor; public class Main { public static void main(String[] args) throws ClassNotFoundException { // 通過Class.forName()方法獲得Class對象 Class stuClass = Class.forName("com.gyl.Student"); System.out.println("************返回所有public構造方法************"); Constructor[] constructors = stuClass.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } /* * Output: * ************返回所有public構造方法************ * public com.gyl.Student() * public com.gyl.Student(java.lang.String,int) */ System.out.println("************所有的構造方法(包括:私有、受保護、默認、公有)***************"); Constructor[] constructors2 = stuClass.getDeclaredConstructors(); for (Constructor constructor : constructors2) { System.out.println(constructor); } /* * Output: * ************所有的構造方法(包括:私有、受保護、默認、公有)*************** * private com.gyl.Student(int) * public com.gyl.Student() * protected com.gyl.Student(char) * public com.gyl.Student(java.lang.String,int) * com.gyl.Student(java.lang.String) */ Constructor constructor; System.out.println("************返回指定類型的 public構造器************"); try { constructor = stuClass.getConstructor(String.class, int.class); System.out.println(constructor); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } /* * Output: * ************返回指定類型的 public構造器************ * public com.gyl.Student(java.lang.String,int) * * 如果指定參數的構造器是非public類型的 則拋出java.lang.NoSuchMethodException異常 */ System.out.println("************返回指定類型的構造器************"); try { constructor = stuClass.getDeclaredConstructor(int.class); System.out.println(constructor); // char.class } catch (NoSuchMethodException e) { // String.class, int.class e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } /* * Output: * ************返回指定類型的構造器************ * public com.gyl.Student(java.lang.String,int) * protected com.gyl.Student(char) * private com.gyl.Student(int) */ } }獲取變量
// 根據變量名獲得對應的變量,訪問權限不限; Field getDeclaredField(String name) // 獲得類中所有屬性變量 Field[] getDeclaredFields() // 根據變量名獲取對應public類型的屬性變量 Field getField(String name) // 獲取類中所有public類型的屬性變量 Field[] getFields()
package com.gyl; import java.lang.reflect.Field; public class Main { public static void main(String[] args) throws ClassNotFoundException { // 通過Class.forName()方法獲得Class對象 Class stuClass = Class.forName("com.gyl.Student"); try { Field field1 = stuClass.getField("sex"); System.out.println(field1); Field field = stuClass.getDeclaredField("name"); System.out.println(field); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } /* * Output: * public java.lang.String com.gyl.Student.sex * private java.lang.String com.gyl.Student.name * 如果使用getField方法指定了一個非public類型的屬性,則拋出java.lang.NoSuchFieldException異常 */ Field[] fields1 = stuClass.getFields(); Field[] fields = stuClass.getDeclaredFields(); System.out.println("************返回所有public屬性************"); for (Field field : fields1) { System.out.println(field); } /* * Output: * ************返回所有public屬性************ * public int com.gyl.Student.no * public java.lang.String com.gyl.Student.sex */ System.out.println("************返回所有屬性************"); for (Field field : fields) { System.out.println(field); } /* * Output: * ************返回所有屬性************ * public int com.gyl.Student.no * public java.lang.String com.gyl.Student.sex * private java.lang.String com.gyl.Student.name * private int com.gyl.Student.age */ } }獲取方法
// 獲取“名稱是name,參數是parameterTypes”的public的函數(包括從基類繼承的、從接口實現的所有public函數) public Method getMethod(String name, Class[] parameterTypes) // 獲取全部的public的函數(包括從基類繼承的、從接口實現的所有public函數) public Method[] getMethods() // 獲取“名稱是name,參數是parameterTypes”,并且是類自身聲明的函數,包含public、protected和private方法。 public Method getDeclaredMethod(String name, Class[] parameterTypes) // 獲取全部的類自身聲明的函數,包含public、protected和private方法。 public Method[] getDeclaredMethods() // 如果這個類是“其它類中某個方法的內部類”,調用getEnclosingMethod()就是這個類所在的方法;若不存在,返回null。 public Method getEnclosingMethod()
package com.gyl; import java.lang.reflect.Method; public class Main { public static void main(String[] args) throws ClassNotFoundException { // 通過Class.forName()方法獲得Class對象 Class stuClass = Class.forName("com.gyl.Student"); Method method; try { // method = stuClass.getMethod("getName"); method = stuClass.getDeclaredMethod("getAge"); System.out.println(method); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } System.out.println("*********輸出所有方法********"); Method[] methods = stuClass.getDeclaredMethods(); for (Method method2 : methods) { System.out.println(method2); } /* * Output: * public int com.gyl.Student.getAge() * *********輸出所有方法******** * public java.lang.String com.gyl.Student.getName() * public void com.gyl.Student.setName(java.lang.String) * void com.gyl.Student.print(java.lang.String) * public int com.gyl.Student.getAge() * public void com.gyl.Student.setAge(int) */ } }通過反射越過泛型檢查
泛型用在編譯期,編譯過后泛型擦除(消失掉)。所以是可以通過反射越過泛型檢查的
import java.lang.reflect.Method; import java.util.ArrayList; /* * 通過反射越過泛型檢查 * * 例如:有一個String泛型的集合,怎樣能向這個集合中添加一個Integer類型的值? */ public class Demo { public static void main(String[] args) throws Exception{ ArrayListstrList = new ArrayList<>(); strList.add("aaa"); strList.add("bbb"); // strList.add(100); //獲取ArrayList的Class對象,反向的調用add()方法,添加數據 Class listClass = strList.getClass(); //得到 strList 對象的字節碼 對象 //獲取add()方法 Method m = listClass.getMethod("add", Object.class); //調用add()方法 m.invoke(strList, 100); //遍歷集合 for(Object obj : strList){ System.out.println(obj); System.out.println(obj.getClass()); } /* *Output: * aaa * class java.lang.String * bbb * class java.lang.String * 100 * class java.lang.Integer */ } }
其他方法請參考Java jdk,本文參考自Java jdk1.8
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69414.html
摘要:一反射機制概念程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言,如,是動態語言顯然,,不是動態語言,但是有著一個非常突出的動態相關機制。相關的為二獲取源頭重點打開權限所有類的對象其實都是的實例。 一、Java反射機制概念 程序運行時,允許改變程序結構或變量類型,這種語言稱為動態語言,如Python, Ruby是動態語言;顯然C++,Java,C#不是動態語言,但是JAVA有...
摘要:反射機制一結合官方通過編寫的反射教程,復習一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應用行為的一種工具。因為反射需要動態的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權限,在特定的安全環境下不一定存在。 Java反射機制(一) 結合Oracle官方通過JDK8編寫的反射教程,復習一下反射的知識。結尾篇補一個小例子。 主要內容 這次博客的主要內容就是簡...
摘要:在的反射包中提供了三個類以及來分別描述屬性方法和構造器。獲取構造器獲取方法可以看到我們可以通過一個類的對象很輕松的獲取他的屬性構造器以及方法信息。返冋一個用于描述構造器名的字符串。 想要獲取更多文章可以訪問我的博客?-?代碼無止境。 上周上班的時候解決一個需求,需要將一批數據導出到Excel。本來公司的中間件組已經封裝好了使用POI生成Excel的工具方法,但是無奈產品的需求里面有個合...
摘要:在思否上面開了一個專欄,主要是想對零散的知識點做一個梳理,在與大家交流的同時,也加強自己的理解。今天主要談一下中的反射機制,雖然實際編程中我們很少直接使用,但是反射機制卻始終圍繞著我們程序員。 在思否上面開了一個專欄,主要是想對零散的知識點做一個梳理,在與大家交流的同時,也加強自己的理解。 ? 今天主要談一下Java中的反射機制,雖然實際編程中我們很少直接使用,但是反射機制卻始終...
閱讀 1125·2021-11-24 10:21
閱讀 2561·2021-11-19 11:35
閱讀 1662·2019-08-30 15:55
閱讀 1293·2019-08-30 15:54
閱讀 1192·2019-08-30 15:53
閱讀 3498·2019-08-29 17:21
閱讀 3308·2019-08-29 16:12
閱讀 3412·2019-08-29 15:23