轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点
生活随笔
收集整理的這篇文章主要介紹了
轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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";} }總結
以上是生活随笔為你收集整理的轻轻松松明白什么是反射,反射有什么用,简单上手反射以及反射的优缺点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解java注解,java的4个元注
- 下一篇: 复习java的java.io.File类