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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点

發布時間:2025/3/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 什么是反射

反射可以動態獲取類信息并創建對象、執行方法、屬性賦值等,通過反射,我們就可以通過字節碼文件反推得到源代碼。

?

2.反射怎么用

2.1 在使用反射前,我們需要介紹4個類,分別是java.lang.Class、java.lang.reflect.Constructor、java.lang.reflect.Method以及java.lang.reflect.Field。因為對于一個字節碼文件來說,其實就是一個類(先不考慮接口、數組等對象),一個類則主要是4部分:類信息、屬性、構造器和方法。所以當我們擁有了這4個類,也就可以通過字節碼來進行操作了。需要被反射的類如下所示。

class Reflect{static{System.out.println("static code seg\n");}private int no;private String name;public Reflect(){System.out.println("no param constructor\n");}public Reflect(int no){this.no = no;System.out.println("int constructor: " + no + "\n");}public Reflect(int no, String name){this.no = no;this.name = name;System.out.println("int--String constructor: " + no + name + "\n");}private void sout(){System.out.println("out");}public int testInt(int i, String s){System.out.println("testInt be invoked: " + i + " " + s);return 20;}public String testString(double i, boolean b){System.out.println("testString Be invoked");return "abc";} }

2.2 為了反推得到源代碼,我們首先要得到類,得到類的Class對象有3種方式:①Class.forName("全限定類名");②通過該類的對象調用getClass()方法;③xxx.class。

這三者完全等價,比較結果都為true,如下圖。

2.3 得到類后,我們可以調用構造器創建對象。

2.4 反射屬性,進行屬性相關的操作

2.5 反射方法

?

3. 反射的優缺點

優點:①通過配置文件設定要反射的類,即可自動完成對象的實例化,然后進行相應操作,完全不需要更改java源代碼,提高了程序的靈活性和拓展性。

缺點:①打破封裝、私有屬性會被訪問;②反射機制是動態解析的,JVM無法進行代碼優化。

?

附錄:最終代碼及結果

import java.lang.reflect.*;public class ReflectTest02 {public static void main(String[] args) throws Exception {// 都會進行類加載,類加載會執行靜態代碼塊,靜態代碼塊只執行一次Class<?> c = Class.forName("Reflect");Class<Reflect> reflectClass = Reflect.class;Reflect reflect = new Reflect();Class<? extends Reflect> aClass = reflect.getClass();// 調用無參構造器來創建對象Object obj = c.getConstructor().newInstance();// 使用StringBuilder拼接字符串,最后輸出StringBuilder sb = new StringBuilder();String sm = Modifier.toString(c.getModifiers());sb.append(sm);sb.append(("".equals(sm) ? "":" ") + "class " + c.getSimpleName() + "{\n");// 得到所有屬性Field[] fields = c.getDeclaredFields();for (Field f: fields) {sb.append("\t");String s = Modifier.toString(f.getModifiers());sb.append(s);sb.append("".equals(s) ? "":" ");sb.append(f.getType().getSimpleName());sb.append(" ");sb.append(f.getName());sb.append(";\n");}// 得到所有的構造器方法Constructor[] constructors = c.getDeclaredConstructors();for (Constructor constructor: constructors) {sb.append("\t");String s = Modifier.toString(constructor.getModifiers());sb.append(s);sb.append("".equals(s) ? "":" ");sb.append(c.getSimpleName() + "(");Class[] parameters = constructor.getParameterTypes();for (Class parameter:parameters) {sb.append(parameter.getSimpleName() + ", ");}if(parameters.length > 0){sb.deleteCharAt(sb.length() - 1);sb.deleteCharAt(sb.length() - 1);}sb.append("){}\n");}// 得到所有的方法Method[] methods = c.getDeclaredMethods();for (Method m: methods) {sb.append("\t");String s1 = Modifier.toString(m.getModifiers());sb.append(s1);sb.append("".equals(s1) ? "":" ");sb.append(m.getReturnType().getSimpleName() + " ");sb.append(m.getName() + "(");Class[] parameters = m.getParameterTypes();for (Class parameter:parameters) {sb.append(parameter.getSimpleName() + ", ");}if(parameters.length > 0){sb.deleteCharAt(sb.length() - 1);sb.deleteCharAt(sb.length() - 1);}sb.append("){}\n");}sb.append("}");System.out.println(sb);} }class Reflect{static{System.out.println("static code seg\n");}private int no;private String name;public Reflect(){System.out.println("no param constructor\n");}public Reflect(int no){this.no = no;System.out.println("int constructor: " + no + "\n");}public Reflect(int no, String name){this.no = no;this.name = name;System.out.println("int--String constructor: " + no + name + "\n");}private void sout(){System.out.println("out");}public int testInt(int i, String s){System.out.println("testInt be invoked: " + i + " " + s);return 20;}public String testString(double i, boolean b){System.out.println("testString be invoked");return "abc";} }

總結

以上是生活随笔為你收集整理的轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点的全部內容,希望文章能夠幫你解決所遇到的問題。

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