亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Core Java筆記 3.反射

2019-11-15 00:00:07
字體:
來源:轉載
供稿:網友
Core java筆記 3.反射本章重點:
  • Class 類
  • 利用反射分析類
  • 在運行時使用反射分析對象
  • 使用反射編寫泛型數組代碼
  • 方法指針

能夠分析類能力的程序稱為反射(reflective). Java 提供了豐富且精心設計的工具集(reflection library).
Class 類

在程序運行期間,Java 運行時系統始終為所有的對象維護著一個運行時的類型標識,這個信息保存著每個對象所屬的類足跡.

獲取 Class 實例.

// 1. 通過實例獲得.Employee e;Class cl = e.getClass();// 2. 通過類名獲得.String className = "java.util.Date";Class cl = Class.forName(className); // need try...catch// 3. 通過類獲得.Class cl = Date.classClass cl = int.class

虛擬機為每個類型管理一個Class對象.

if (e.getClass = Employee.class) ...

通過 Class 創建實例.

e.getClass().newInstance();   // 需要有無參構造器Date.getClass().newInstance();Class.forName("xxx").newInstance();

利用反射分析類

java.lang.reflect包中的三個核心類: Field、Method、Constructor.

使用反射分析類

package corejava.reflection;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.Scanner;/** * Created by guolong.fan on 15/4/24. */public class ReflectionTest {    public static void main(String[] args) {        String name;        if (args.length > 0) name = args[0];        else {            Scanner in = new Scanner(System.in);            System.out.PRintln("Enter class name(e.g. java.util.Date):");            name = in.next();        }        try {            // print class name and superclass name(if != Object)            Class cl = Class.forName(name);            Class supercl = cl.getSuperclass();            String modifiers = Modifier.toString(cl.getModifiers());            if (modifiers.length() > 0) System.out.print(modifiers + " ");            System.out.print("class " + name);            if (supercl != null && supercl != Object.class) {                System.out.print(" extends " + supercl.getName());            }            System.out.println(" {");            printConstructors(cl);            System.out.println();            printMethods(cl);            System.out.println();            printFields(cl);            System.out.println("}");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    private static void printConstructors(Class cl) {        Constructor[] constructors = cl.getDeclaredConstructors();        for (Constructor c : constructors) {            String name = c.getName();            System.out.print("/t");            String modifiers = Modifier.toString(c.getModifiers());            if (modifiers.length() > 0) System.out.print(modifiers + " ");            System.out.print(name + "(");            Class[] paramTypes = c.getParameterTypes();            for (int j = 0; j < paramTypes.length; ++j) {                if (j > 0) System.out.print(", ");                System.out.print(paramTypes[j].getName());            }            System.out.print(")");            Class[] expTypes = c.getExceptionTypes();            if (expTypes.length > 0) System.out.print(" throws ");            for (int j = 0; j < expTypes.length; ++j) {                if (j > 0) System.out.print(", ");                System.out.print(expTypes[j].getName());            }            System.out.println(";");        }    }    private static void printMethods(Class cl) {        Method[] methods = cl.getDeclaredMethods();        for (Method m : methods) {            String name = cl.getName();            Class refType = m.getReturnType();            System.out.print("/t");            String modifiers = Modifier.toString(m.getModifiers());            if (modifiers.length() > 0) System.out.print(modifiers + " ");            System.out.print(refType.getName() + " ");            System.out.print(name + "(");            Class[] paramTypes = m.getParameterTypes();            for (int j = 0; j < paramTypes.length; ++j) {                if (j > 0) System.out.print(", ");                System.out.print(paramTypes[j].getName());            }            System.out.print(")");            Class[] expTypes = m.getExceptionTypes();            if (expTypes.length > 0) System.out.print(" throws ");            for (int j = 0; j < expTypes.length; ++j) {                if (j > 0) System.out.print(", ");                System.out.print(expTypes[j].getName());            }            System.out.println(";");        }    }    private static void printFields(Class cl) {        Field[] fields = cl.getDeclaredFields();        for (Field f : fields) {            String name = f.getName();            Class type = f.getType();            String modifiers = Modifier.toString(f.getModifiers());            System.out.print("/t");            if (modifiers.length() > 0) System.out.print(modifiers + " ");            System.out.println(type.getName() + " " + name + ";");        }    }}

在運行時使用反射分析對象

實現通用的toString.

package corejava.reflection;import java.lang.reflect.accessibleObject;import java.lang.reflect.Array;import java.lang.reflect.Field;import java.lang.reflect.Modifier;import java.util.ArrayList;import java.util.List;/** * Created by guolong.fan on 15/4/24. */public class ObjectAnalyzer {    /**     * Converts an object to a string representation that lists all fields.     * @param obj an object     * @return a string with the obejct's class name and all fields name and     * values     */    public String toString(Object obj) {        if (obj == null) return "null";        if (visited.contains(obj)) return "...";        visited.add(obj);        Class cl = obj.getClass();        if (cl == String.class) return (String)obj;        if (cl.isArray()) {            String r = cl.getComponentType() + "[]{";            for (int i = 0; i < Array.getLength(obj); ++i) {                if (i > 0) r += ",";                Object val = Array.get(obj, i);                if (cl.getComponentType().isPrimitive()) r += val;                else r += toString(val);            }            return r + "}";        }        String r = cl.getName();        // inspect the fields of this class and all superclasses        do {            r += "[";            Field[] fields = cl.getDeclaredFields();            AccessibleObject.setAccessible(fields, true);            for (Field f : fields) {                if (!Modifier.isStatic(f.getModifiers())) {                    if (!r.endsWith("[")) r += ",";                    r += f.getName() + "=";                    try {                        Class t = f.getType();                        Object val = f.get(obj);                        if (t.isPrimitive()) r += val;                        else r += toString(val);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }            r += "]";            cl = cl.getSuperclass();        } while (cl != null);        return r;    }    private List<Object> visited = new ArrayList<Object>();    public static void main(String[] args) {        ArrayList<Integer> squares = new ArrayList<Integer>();        for (int i = 0; i < 5; ++i) {            squares.add(i * i);        }        System.out.println(new ObjectAnalyzer().toString(squares));        System.out.println(squares);    }}

使用反射編寫泛型數組代碼
package corejava.reflection;import java.lang.reflect.Array;/** * Created by guolong.fan on 15/4/24. */public class ArrayGrowTest {    public static void main(String[] args) {        int[] a = { 1, 2, 3 };        a = (int[])goodArrayGrow(a);        String[] b = { "Tom", "Dick", "Harry" };        b = (String[]) goodArrayGrow(b);        // Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;        // at corejava.reflection.ArrayGrowTest.main(ArrayGrowTest.java:10)        System.out.println("The following call will generate an exception.");        b = (String[])badArrayGrow(b);        // 要理解這些,需要把泛型數組看成一種類型。Integer[] 和 Object[] 不是一種類型!!!        // 有自己的 Class 對象!!!        Integer[] intArr = new Integer[10];        Object[] objArr = intArr;  // OK        // Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;        // at corejava.reflection.ArrayGrowTest.main(ArrayGrowTest.java:20)        Object[] objArr2 = new Object[10];        Integer[] intArr2 = (Integer[])objArr2; // Exception    }    /**     * This method attempts to grow an array by alocating a new array and copying all elements.     * @param a the array to grow     * @return a larger array that contains all elements of a. However, the returned array has     * type Object[], not the same type as a.     */    static Object[] badArrayGrow(Object[] a) {        int newLength = a.length * 11 / 10 + 10;        Object[] newArray = new Object[newLength];        System.arraycopy(a, 0, newArray, 0, a.length);        return newArray; // newArray is Object[], not the same type as a.    }    /**     * This method grows an array by allocating a new array of the same type and     * copying all elements.     * @param a the array to grow. This can be an object array or a primitive     *          type array     * @return a larger array that contains all elements of a.     */    static Object goodArrayGrow(Object a) {        if (a == null) return null;        Class cl = a.getClass();        if (!cl.isArray()) return null;        Class componentType = cl.getComponentType();        int length = Array.getLength(a);  // 獲取a的類型        int newLength = length * 11 / 10 + 10;        Object newArray = Array.newInstance(componentType, newLength); // newArray is the same type as a!!        System.arraycopy(a, 0, newArray, 0, length);        return newArray;    }}

方法指針

Java 沒有提供方法指針,但是利用反射可以實現方法指針,但是從設計角度來說,方法指針會來帶隱患. interface 是更好的解決方案.

Method m1 = Employee.class.getMethod("getName");Method m2 = Employee.class.getMethod("raiseSalary", double.class);Employee e = new Employee();m1.invoke(e);m2.invoke(e, 1.0);

示例:

package corejava.reflection;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * Created by guolong.fan on 15/4/24. */public class MethodPointerTest {    public static void main(String[] args) throws NoSuchMethodException {        Method square = MethodPointerTest.class.getMethod("squre", double.class);        printTable(1, 10, 10, square);    }    public static double squre(double x) {        return x * x;    }    private static void printTable(double from, double to, int n, Method f) {        double dx = (to - from) / (n - 1);        for (double x = from; x <= to; x += dx) {            try {                double y = (Double)f.invoke(null, x);                System.out.printf("%10.4f | %10.4f/n", x, y);            } catch (IllegalAccessException e) {                e.printStackTrace();            } catch (InvocationTargetException e) {                e.printStackTrace();            }        }    }}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕精品—区二区| 成人国产精品免费视频| 国产精品久久久久福利| 欧美午夜激情视频| 精品二区三区线观看| 欧美人交a欧美精品| 成人激情黄色网| 欧美成人精品不卡视频在线观看| 亚洲欧美精品伊人久久| 久久久亚洲国产天美传媒修理工| 啊v视频在线一区二区三区| 色偷偷偷亚洲综合网另类| 色黄久久久久久| 亚洲a区在线视频| 亚洲天堂影视av| 亚洲电影在线看| 久久久久久91香蕉国产| 国产亚洲精品久久久优势| 国产成人精品午夜| 国产大片精品免费永久看nba| 久久久久在线观看| 亚洲综合在线中文字幕| 日韩av手机在线观看| 国产精品中文字幕在线观看| 中文字幕欧美亚洲| 日韩中文字幕在线免费观看| 久热爱精品视频线路一| 姬川优奈aav一区二区| 美女福利视频一区| 欧美高清自拍一区| 热99久久精品| 亚洲最新av在线网站| 国产va免费精品高清在线观看| 国产精品美女久久久免费| 国产精品中文在线| 一区二区三区视频免费| 日韩久久午夜影院| 国产精品狠色婷| 国产成人精彩在线视频九色| 国产手机视频精品| 国产精品久久电影观看| 成人亲热视频网站| 精品视频偷偷看在线观看| 久久av在线看| 欧美亚洲第一页| 一夜七次郎国产精品亚洲| 综合国产在线视频| 久久69精品久久久久久久电影好| 亚洲精品按摩视频| 成人黄在线观看| 日韩欧美亚洲范冰冰与中字| 伊人久久久久久久久久久久久| 麻豆精品精华液| 久久综合五月天| 欧美激情2020午夜免费观看| 91超碰caoporn97人人| 久久不射热爱视频精品| 欧美乱大交xxxxx另类电影| 91产国在线观看动作片喷水| 中文字幕视频一区二区在线有码| 欧美亚洲另类激情另类| 欧美一级成年大片在线观看| 欧美xxxx做受欧美.88| 欧美性视频网站| 国产成人精品日本亚洲| 欧美老少做受xxxx高潮| 国产成人精品网站| 国产亚洲欧美视频| 国产一区二区三区毛片| 国产欧美亚洲视频| 欧美性xxxxxxx| 国产精品美女无圣光视频| 久久69精品久久久久久久电影好| 欧美成人午夜免费视在线看片| 国产在线视频2019最新视频| 福利视频导航一区| 第一福利永久视频精品| www.欧美精品| 成人激情免费在线| 色琪琪综合男人的天堂aⅴ视频| 欧美成人三级视频网站| 日韩视频永久免费观看| 成人免费观看a| 亚洲成av人乱码色午夜| 久久人人爽人人爽人人片av高清| 成人黄色免费网站在线观看| 岛国精品视频在线播放| 日韩大陆毛片av| 色哟哟网站入口亚洲精品| 欧美插天视频在线播放| 日韩精品久久久久久久玫瑰园| 成人黄色片网站| 欧美日韩在线影院| 欧美国产日韩中文字幕在线| 亚洲xxxxx电影| 91精品国产高清久久久久久| 欧美日韩国产激情| 欧日韩不卡在线视频| 久久男人av资源网站| 欧美日韩中文字幕综合视频| 66m—66摸成人免费视频| 国产不卡视频在线| 欧美激情视频播放| 日韩国产欧美区| 亚洲色图17p| 国产99久久精品一区二区| 亚洲免费伊人电影在线观看av| 欧美多人乱p欧美4p久久| 欧美黄色片免费观看| www.久久草.com| 日韩精品免费看| 在线看欧美日韩| 一区二区日韩精品| 91亚洲精品一区二区| 亚洲精品国产精品国产自| 日韩欧美在线观看视频| 欧美视频中文在线看| 日韩在线视频导航| 亚洲国产精品久久久久秋霞不卡| 日本午夜精品理论片a级appf发布| 热re91久久精品国99热蜜臀| 欧美激情亚洲精品| 精品无人区乱码1区2区3区在线| 久久久国产视频| 91久久国产精品91久久性色| 66m—66摸成人免费视频| 欧美日韩成人精品| 亚洲小视频在线观看| 色综合久久中文字幕综合网小说| 日韩国产中文字幕| 欧美激情视频在线免费观看 欧美视频免费一| 精品亚洲国产成av人片传媒| 日韩电影网在线| 97精品久久久| 久久精品国产免费观看| 国产精品免费视频久久久| 91高潮在线观看| 91精品国产综合久久久久久久久| 成人免费视频网址| 九色精品免费永久在线| 精品在线观看国产| 精品福利一区二区| 亚洲精品自产拍| 欧美日韩中文字幕综合视频| 这里只有视频精品| 国产不卡av在线| 国产一区二区丝袜高跟鞋图片| 欧美日韩国产限制| 午夜精品三级视频福利| 亚洲free性xxxx护士白浆| 亚洲欧美精品一区| 日日狠狠久久偷偷四色综合免费| 高清一区二区三区日本久| 亚洲精品久久久久中文字幕欢迎你| 精品在线观看国产| 成人av.网址在线网站| www.日韩系列| 中文字幕一区二区三区电影| 亚洲人在线视频| 欧美日韩国产中文字幕| 欧美成人精品激情在线观看| 久热国产精品视频| 亚洲欧美在线免费观看| 久久夜色精品国产亚洲aⅴ|