日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

反射基本操作

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 反射基本操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

三種獲得字節碼對象的方法:

反射獲取構造方法的使用:

反射獲取成員變量并使用:

?反射獲取成員方法并使用:

反射的部分應用實例:


三種獲得字節碼對象的方法:

??????? 首先創建一個學生類:

??????? 該學生類會用于以下所有的演示中

package com.Demo01;public class Student {// 成員變量:一個私有,一個默認,兩個公共private String name;int age;public String address;// 構造方法:一個私有,一個默認,兩個公共public Student() {}private Student(String name) {this.name = name;}Student(String name, int age) {this.name = name;this.age = age;}public Student(String name, int age, String address) {this.name = name;this.age = age;this.address = address;}// 成員方法:一個私有,四個公共private void function(){System.out.println("function");}public void method1(){System.out.println("method");}public void method2(String s){System.out.println("method:" + s);}public String method3(String s, int i){return s + "," + i;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", address='" + address + '\'' +'}';} }

然后創建一個測試類,實現三種字節碼對象的獲取:

以下所有的forName方法地址都需要自己輸入自己的實際地址

?以上就是筆者Student類放置的位置,可根據自己的放置位置模仿筆者書寫地址。

package com.Demo01;/*** 三種方式獲得字節碼文件對象*/public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException {// 使用類的class屬性來獲取該類對應的class對象Class<Student> c1 = Student.class; // 獲得Student類的字節碼文件對象System.out.println(c1);Class<Student> c2 = Student.class;// 一個類的字節碼文件對象只有一個,所以此處應該相等System.out.println(c1 == c2);System.out.println("======================");// 調用對象的getClass()方法,返回該對象所屬類對應的Class對象Student s = new Student();Class<? extends Student> c3 = s.getClass();System.out.println(c1 == c3);System.out.println("=====================");// 使用Class類中的靜態方法farName(String className)Class<?> c4 = Class.forName("com.Demo01.Student");} }

反射獲取構造方法的使用:

具體類的實現可以查看API中Class類中的方法:

package com.Demo02;import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException;/*** 反射獲取構造方法的使用*/ public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {// 獲取Class對象Class<?> c = Class.forName("com.Demo01.Student");//Constructor<?>[] getConstructors()//返回包含一個數組 Constructor對象反射由此表示的類的所有公共構造 類對象。Constructor<?>[] cons = c.getConstructors();// 這里私有構造方法和默認構造方法未顯示for(Constructor<?> con:cons){System.out.println(con);}//Constructor<?>[] getDeclaredConstructors()//返回一個反映 Constructor對象表示的類聲明的所有 Constructor對象的數組 類 。// 該方法可以返回所有的構造方法,可以顯示默認和私有方法System.out.println("============");Constructor<?>[] decl = c.getDeclaredConstructors();for(Constructor<?> dec : decl){System.out.println(dec);}System.out.println("============");// Constructor<T> getDeclaredConstructor(類<?>... parameterTypes)//返回一個 Constructor對象,該對象反映 Constructor對象表示的類或接口的指定 類函數。// 參數:你要獲取的構造方法的參數的個數和數據類型對應的字節碼文件對象Constructor<?> con = c.getConstructor();// 創建對象信息Object obj = con.newInstance();System.out.println(obj);} }

反射獲取成員變量并使用:

package com.Demo03;import com.Demo01.Student;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException;/*** 反射獲取成員變量并使用*/ public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {// 獲取Class對象Class<?> c = Class.forName("com.Demo01.Student");//Field[] getFields()//返回包含一個數組 Field對象反射由此表示的類或接口的所有可訪問的公共字段 類對象。//Field[] getDeclaredFields() //返回的數組 Field對象反映此表示的類或接口聲明的所有字段 類對象。 Field[] fields = c.getFields();for (Field field : fields) { // 看到公共成員變量System.out.println(field);}System.out.println("==============");Field[] declaredFields = c.getDeclaredFields();for (Field field : declaredFields) { // 看到私有、默認、公共成員變量System.out.println(field);}System.out.println("================");//Field getField(String name)//返回一個 Field對象,它反映此表示的類或接口的指定公共成員字段 類對象。//Field getDeclaredField(String name)//返回一個 Field對象,它反映此表示的類或接口的指定已聲明字段 類對象。Field addressField = c.getField("address");// 獲取無參構造方法創建對象Constructor<?> con = c.getConstructor();Object obj = con.newInstance();// obj.addressField = "西安";addressField.set(obj,"西安"); // 給obj的成員變量addressField賦值為西安System.out.println(obj);/*Student s = new Student();s.address = "西安";System.out.println(s); */}}

?反射獲取成員方法并使用:

package com.Demo04;import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** 反射獲取成員方法并使用*/ public class ReflectDemo {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {// 獲取Class對象Class<?> c = Class.forName("com.Demo01.Student");// Methods[] getMethods()//返回包含一個數組 方法對象反射由此表示的類或接口的所有公共方法 類對象,包括那些由類或接口和那些從超類和超接口繼承的聲明。//Methods[] getDeclaredMethods()//返回包含一個數組 方法對象反射的類或接口的所有聲明的方法,通過此表示 類對象,包括公共,保護,默認(包)訪問和私有方法,但不包括繼承的方法。Method[] methods = c.getMethods();// 包括繼承的方法,不包括私有方法for (Method method : methods){System.out.println(method);}System.out.println("=============");Method[] declaredMethods = c.getDeclaredMethods();// 不包括繼承的方法,包括私有對象for (Method dec : declaredMethods){System.out.println(dec);}System.out.println("==============");//方法 getMethod(String name, 類<?>... parameterTypes)//返回一個 方法對象,它反映此表示的類或接口的指定公共成員方法 類對象。// 方法 getDeclaredMethod(String name, 類<?>... parameterTypes)//返回一個 方法對象,它反映此表示的類或接口的指定聲明的方法 類對象。Method m = c.getMethod("method1");// 獲取無參構造方法創建對象Constructor<?> con = c.getConstructor();Object obj = con.newInstance();m.invoke(obj);}}

反射的部分應用實例:

??????? 采用反射方法越過泛型檢查

package com.Demo05;import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList;/*** 反射練習之越過泛型檢查* 題目:有一個ArrayList<Integer>集合,現在我想對在這個集合中添加一個字符串數據,如何實現?*/ public class ReflectDemo {public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {ArrayList<Integer> array = new ArrayList<Integer>();// 添加數字時正常,添加字符串由于類型不合適導致錯誤 // array.add(10); // array.add(20); // array.add("asdad");// 采用反射解決// 反射方法可以越過泛型檢查,獲得原始方法Class<? extends ArrayList> c = array.getClass();Method m = c.getMethod("add", Object.class);m.invoke(array,"hello");m.invoke(array,"word");m.invoke(array,"java");System.out.println(array);} } 運行配置文件指定內容:

Student類:

package com.Demo06;public class Student {public void study(){System.out.println("好好學習天天向上");} }

Teacher類:

package com.Demo06;public class Teacher {public void teach(){System.out.println("用愛成就學員");} }

配置文件:

className=com.Demo06.Student methodName=study

測試類:

package com.Demo06;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Properties;/*** 運行配置文件指定內容*/ public class ReflectDemo {public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { // Student s = new Student(); // s.study();// Teacher t = new Teacher(); // t.teach();// 通過反射實現對運行配置文件的配置// 這樣可以不用怕頻繁修改main方法/*class.txtclassName=xxxmethodName=xxx*/// 加載數據Properties prop = new Properties();FileReader fr = new FileReader("src/com/Demo06/class.txt");prop.load(fr);fr.close();/*className=com.Demo06.StudentmethodName=study*/String className = prop.getProperty("className");String methodName = prop.getProperty("methodName");// 通過反射來使用Class<?> c = Class.forName(className);Constructor<?> con = c.getConstructor();Object obj = con.newInstance();Method m = c.getMethod(methodName);//studym.invoke(obj);} }

只需要根據調整配置文件即可,不需要改動代碼即可以實現Student和Teacher之間的實現轉換。

總結

以上是生活随笔為你收集整理的反射基本操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。