摘要:有一個參數(shù)的構(gòu)造方法姓名有多個參數(shù)的構(gòu)造方法姓名年齡這的執(zhí)行效率有問題,以后解決。私有構(gòu)造方法私有的構(gòu)造方法年齡反射獲取對象的三種方式通過對象名方法獲取通過類名方式獲得通過方法獲得在運行期間,一個類,只有一個對象產(chǎn)生。
原文地址
反射簡單來說,就是動態(tài)加載對象,并對對象進(jìn)行剖析。在Java中的反射機(jī)制是指在運行狀態(tài)中,對于任意一個類,都能夠知道并獲取這個類的所有屬性和方法。
Java反射機(jī)制的作用:在運行時判斷任意一個對象所屬的類。
在運行時判斷任意一個類所具有的成員變量和方法。
在運行時任意調(diào)用一個對象的方法
在運行時構(gòu)造任意一個類的對象
反射機(jī)制的優(yōu)缺點是什么?反射機(jī)制的優(yōu)點就是可以實現(xiàn)動態(tài)創(chuàng)建對象和編譯,體現(xiàn)出很大的靈活性。
它的缺點是對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什么并且它
滿足我們的要求。這類操作總是慢于只直接執(zhí)行相同的操作。
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; } /* * 構(gòu)造方法 */ Student(String str){ System.out.println("(默認(rèn))的構(gòu)造方法 s = " + str); } //無參構(gòu)造方法 public Student(){ System.out.println("調(diào)用了公有、無參構(gòu)造方法執(zhí)行了。。。"); } //有一個參數(shù)的構(gòu)造方法 protected Student(char name){ System.out.println("姓名:" + name); } //有多個參數(shù)的構(gòu)造方法 public Student(String name ,int age){ System.out.println("姓名:"+name+"年齡:"+ age);//這的執(zhí)行效率有問題,以后解決。 } //私有構(gòu)造方法 private Student(int age){ System.out.println("私有的構(gòu)造方法 年齡:"+ 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對象產(chǎn)生。三種方式常用第三種,第一種對象都有了還要反射干什么。第二種需要導(dǎo)入類的包,依賴太強(qiáng),不導(dǎo)包就拋編譯錯誤。一般都選第三種,一個字符串可以傳入也可寫在配置文件中等多種方法。反射API 獲取構(gòu)造方法
// 返回指定參數(shù)類型 public的構(gòu)造器。 ConstructorgetConstructor(類>... parameterTypes) // 返回指定參數(shù)類型的構(gòu)造器(public, protected, private)。 Constructor getDeclaredConstructor(類>... parameterTypes) // 返回所有的public類型的構(gòu)造器 Constructor>[] getConstructors() // 返回所有的構(gòu)造器 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構(gòu)造方法************"); Constructor[] constructors = stuClass.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); } /* * Output: * ************返回所有public構(gòu)造方法************ * public com.gyl.Student() * public com.gyl.Student(java.lang.String,int) */ System.out.println("************所有的構(gòu)造方法(包括:私有、受保護(hù)、默認(rèn)、公有)***************"); Constructor[] constructors2 = stuClass.getDeclaredConstructors(); for (Constructor constructor : constructors2) { System.out.println(constructor); } /* * Output: * ************所有的構(gòu)造方法(包括:私有、受保護(hù)、默認(rèn)、公有)*************** * 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構(gòu)造器************"); try { constructor = stuClass.getConstructor(String.class, int.class); System.out.println(constructor); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } /* * Output: * ************返回指定類型的 public構(gòu)造器************ * public com.gyl.Student(java.lang.String,int) * * 如果指定參數(shù)的構(gòu)造器是非public類型的 則拋出java.lang.NoSuchMethodException異常 */ System.out.println("************返回指定類型的構(gòu)造器************"); 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: * ************返回指定類型的構(gòu)造器************ * public com.gyl.Student(java.lang.String,int) * protected com.gyl.Student(char) * private com.gyl.Student(int) */ } }獲取變量
// 根據(jù)變量名獲得對應(yīng)的變量,訪問權(quán)限不限; Field getDeclaredField(String name) // 獲得類中所有屬性變量 Field[] getDeclaredFields() // 根據(jù)變量名獲取對應(yīng)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,參數(shù)是parameterTypes”的public的函數(shù)(包括從基類繼承的、從接口實現(xiàn)的所有public函數(shù)) public Method getMethod(String name, Class[] parameterTypes) // 獲取全部的public的函數(shù)(包括從基類繼承的、從接口實現(xiàn)的所有public函數(shù)) public Method[] getMethods() // 獲取“名稱是name,參數(shù)是parameterTypes”,并且是類自身聲明的函數(shù),包含public、protected和private方法。 public Method getDeclaredMethod(String name, Class[] parameterTypes) // 獲取全部的類自身聲明的函數(shù),包含public、protected和private方法。 public Method[] getDeclaredMethods() // 如果這個類是“其它類中某個方法的內(nèi)部類”,調(diào)用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對象,反向的調(diào)用add()方法,添加數(shù)據(jù) Class listClass = strList.getClass(); //得到 strList 對象的字節(jié)碼 對象 //獲取add()方法 Method m = listClass.getMethod("add", Object.class); //調(diào)用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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/69414.html
摘要:一反射機(jī)制概念程序運行時,允許改變程序結(jié)構(gòu)或變量類型,這種語言稱為動態(tài)語言,如,是動態(tài)語言顯然,,不是動態(tài)語言,但是有著一個非常突出的動態(tài)相關(guān)機(jī)制。相關(guān)的為二獲取源頭重點打開權(quán)限所有類的對象其實都是的實例。 一、Java反射機(jī)制概念 程序運行時,允許改變程序結(jié)構(gòu)或變量類型,這種語言稱為動態(tài)語言,如Python, Ruby是動態(tài)語言;顯然C++,Java,C#不是動態(tài)語言,但是JAVA有...
摘要:反射機(jī)制一結(jié)合官方通過編寫的反射教程,復(fù)習(xí)一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應(yīng)用行為的一種工具。因為反射需要動態(tài)的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權(quán)限,在特定的安全環(huán)境下不一定存在。 Java反射機(jī)制(一) 結(jié)合Oracle官方通過JDK8編寫的反射教程,復(fù)習(xí)一下反射的知識。結(jié)尾篇補一個小例子。 主要內(nèi)容 這次博客的主要內(nèi)容就是簡...
摘要:在的反射包中提供了三個類以及來分別描述屬性方法和構(gòu)造器。獲取構(gòu)造器獲取方法可以看到我們可以通過一個類的對象很輕松的獲取他的屬性構(gòu)造器以及方法信息。返冋一個用于描述構(gòu)造器名的字符串。 想要獲取更多文章可以訪問我的博客?-?代碼無止境。 上周上班的時候解決一個需求,需要將一批數(shù)據(jù)導(dǎo)出到Excel。本來公司的中間件組已經(jīng)封裝好了使用POI生成Excel的工具方法,但是無奈產(chǎn)品的需求里面有個合...
摘要:在思否上面開了一個專欄,主要是想對零散的知識點做一個梳理,在與大家交流的同時,也加強(qiáng)自己的理解。今天主要談一下中的反射機(jī)制,雖然實際編程中我們很少直接使用,但是反射機(jī)制卻始終圍繞著我們程序員。 在思否上面開了一個專欄,主要是想對零散的知識點做一個梳理,在與大家交流的同時,也加強(qiáng)自己的理解。 ? 今天主要談一下Java中的反射機(jī)制,雖然實際編程中我們很少直接使用,但是反射機(jī)制卻始終...
閱讀 1133·2021-11-24 10:21
閱讀 2573·2021-11-19 11:35
閱讀 1673·2019-08-30 15:55
閱讀 1301·2019-08-30 15:54
閱讀 1203·2019-08-30 15:53
閱讀 3512·2019-08-29 17:21
閱讀 3314·2019-08-29 16:12
閱讀 3424·2019-08-29 15:23