亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Reflection:Java反射機(jī)制基礎(chǔ)

hizengzeng / 2177人閱讀

摘要:反射機(jī)制是什么反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為語言的反射機(jī)制反射機(jī)制能做什么反射機(jī)制主要提供了以下功

反射機(jī)制是什么

反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意一個(gè)方法和屬性;這種動(dòng)態(tài)獲取的信息以及動(dòng)態(tài)調(diào)用對(duì)象的方法的功能稱為java語言的反射機(jī)制

反射機(jī)制能做什么

反射機(jī)制主要提供了以下功能:

在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類

在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象

在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法

在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法

生成動(dòng)態(tài)代理

反射機(jī)制的相關(guān)API 通過一個(gè)對(duì)象獲得完整的包名和類名
    @Test
    public void getReflectionName() {
        String str = new String();
        System.out.println(str.getClass().getName()); // java.lang.String
        System.out.println(str.getClass().getSimpleName()); // String
    }
實(shí)例化Class類對(duì)象(三種方式)
    @Test
    public void getInitClazz() {

        try {
            // 方式一:
            Class clazz_1 = Class.forName("java.lang.String");
            // 方式二:
            Class clazz_2 = new String().getClass();
            // 方式三:
            Class clazz_3 = String.class;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
獲取一個(gè)對(duì)象的父類與實(shí)現(xiàn)的接口
    @Test
    public void getParentAndIntefaces() {

        try {
            Class clazz = Class.forName("java.lang.String");
            // 取得父類
            Class parentClass = clazz.getSuperclass();
            System.out.println("clazz的父類為:" + parentClass.getName());// clazz的父類為: java.lang.Object
            
            // 獲取所有的接口
            Class intes[] = clazz.getInterfaces();
            System.out.println("clazz實(shí)現(xiàn)的接口有:");
            for (int i = 0; i < intes.length; i++) {
                System.out.println((i + 1) + ":" + intes[i].getName());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
通過反射獲取屬性
    @Test
    public void getFieldsByReflect() {

        try {
                Class clazz = String.class ;
                // 取得本類的全部屬性
                Field[] declaredFields = clazz.getDeclaredFields(); 
                // 取得實(shí)現(xiàn)的接口或者父類的屬性
                Field[] fields = clazz.getFields();
                
                //遍歷本類屬性
                for (Field field : declaredFields) {
                    // 權(quán)限修飾符
                    int mo = field.getModifiers();
                    String priv = Modifier.toString(mo);
                    // 屬性類型
                    Class type = field.getType();
                    System.out.println(priv + " " + type.getName() + " " + field.getName() + ";");
                }
                
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
通過反射獲取方法函數(shù)
    @Test
    public void getMethodsByReflect() {

        try {
            Class clazz = String.class ;
            // 類的所有公用(public)方法包括其繼承類的公用方法,當(dāng)然也包括它所實(shí)現(xiàn)接口的方法
            Method[] methods = clazz.getMethods();
            // 類或接口聲明的所有方法,包括公共、保護(hù)、默認(rèn)(包)訪問和私有方法,但不包括繼承的方法。當(dāng)然也包括它所實(shí)現(xiàn)接口的方法
            Method[] declaredMethods = clazz.getDeclaredMethods();
            
            //遍歷本類屬性
            for (Method method : methods) {
                // 權(quán)限修飾符
                int mo = method.getModifiers();
                String priv = Modifier.toString(mo);
                //返回值
                Class returnType = method.getReturnType();
                //方法名
                String methodName = method.getName();
                //方法參數(shù)類型
                Class[] parameterTypes = method.getParameterTypes();
                //拋出的異常
                Class[] exceptionTypes = method.getExceptionTypes();
            }
            
    } catch (Exception e) {
        e.printStackTrace();
    }
    }
通過反射獲取構(gòu)造方法
    @Test
    public void getConstructorsByReflect() {

        try {
            Class clazz = Class.forName("java.lang.String");
            
            //獲取構(gòu)造方法
            Constructor[] constructors = clazz.getConstructors();
            for (Constructor constructor : constructors) {
                
                //獲取構(gòu)造方法的參數(shù)
                Class[] parameterTypes = constructor.getParameterTypes();
                for (Class clazzType : parameterTypes) {
                    System.out.print(clazzType.getSimpleName() + "   ");
                }
                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
通過反射機(jī)制設(shè)置屬性
    @Test
    public void oprFieldsByReflect() {

        try {
            
            Class clazz = Class.forName("java.lang.String");
            //實(shí)例化對(duì)象
            String str = new String("String");
            //可以直接對(duì) private 的屬性賦值
            Field field = clazz.getDeclaredField("hash");
            //改變屬性
            field.setAccessible(true);
            //調(diào)用映射屬性
            field.set(str, 0);
            
            System.out.println(field.get(str));
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
通過反射機(jī)制調(diào)用方法
    @Test
    public void oprMethodsByReflect() {

        try {
            Class clazz = Class.forName("java.lang.String");
            //實(shí)例化一個(gè)對(duì)象
            String str = new String("String");
            //反射出一個(gè)方法
            Method method =  clazz.getMethod("startsWith", String.class);
            //調(diào)用映射方法
            Object result = method.invoke(str, "Str");
            
            System.out.println(result);
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
實(shí)例應(yīng)用 在泛型為Integer的ArrayList中存放一個(gè)String類型的對(duì)象
    /**
     * 在泛型為Integer的ArrayList中存放一個(gè)String類型的對(duì)象
     * @throws Exception
     */
    @Test
    public void test() throws Exception {
           ArrayList list = new ArrayList();
            Method method = list.getClass().getMethod("add", Object.class);
            method.invoke(list, "Java反射機(jī)制實(shí)例");
            System.out.println(list.get(0));
    }
通過反射取得并修改數(shù)組的信息
    /**
     * 通過反射取得并修改數(shù)組的信息
     * 
     * @throws Exception
     */
    @Test
    public void test() throws Exception {
        int[] temp = { 1, 2, 3, 4, 5 };
        Class demo = temp.getClass().getComponentType();
        
        System.out.println("數(shù)組類型: " + demo.getName());
        
        System.out.println("數(shù)組長(zhǎng)度  " + Array.getLength(temp));
        
        System.out.println("數(shù)組的第一個(gè)元素: " + Array.get(temp, 0));
        
        Array.set(temp, 0, 100);
        System.out.println("修改之后數(shù)組第一個(gè)元素為: " + Array.get(temp, 0));
    }
通過反射機(jī)制修改數(shù)組的大小
   /**
     * 通過反射機(jī)制修改數(shù)組的大小
     * 
     * @throws Exception
     */
    @Test
    public void test() throws Exception {

        int[] temp = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        int[] newTemp = (int[]) arrayInc(temp, 15);
        print(newTemp);
        String[] atr = { "a", "b", "c" };
        String[] str1 = (String[]) arrayInc(atr, 8);
        print(str1);
    }

    // 修改數(shù)組大小
    private static Object arrayInc(Object obj, int len) {
        Class arr = obj.getClass().getComponentType();
        Object newArr = Array.newInstance(arr, len);
        int co = Array.getLength(obj);
        System.arraycopy(obj, 0, newArr, 0, co);
        return newArr;
    }

    // 打印
    private static void print(Object obj) {
        Class c = obj.getClass();
        if (!c.isArray()) {
            return;
        }
        System.out.println("數(shù)組長(zhǎng)度為: " + Array.getLength(obj));
        for (int i = 0; i < Array.getLength(obj); i++) {
            System.out.print(Array.get(obj, i) + " ");
        }
        System.out.println();
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67320.html

相關(guān)文章

  • ReflectionJava反射機(jī)制的應(yīng)用場(chǎng)景

    近期在維護(hù)公司項(xiàng)目的時(shí)候遇到一個(gè)問題,因?yàn)閷?shí)體類中的 set 方法涉及到了業(yè)務(wù)邏輯,因此在給對(duì)象賦值的過程中不能夠使用 set 方法,為了實(shí)現(xiàn)功能,所以采用了反射的機(jī)制給對(duì)象屬性賦值,借此機(jī)會(huì)也了解了反射的一些具體用法和使用場(chǎng)景,分以下兩點(diǎn)對(duì)反射進(jìn)行分析: 反射的優(yōu)勢(shì)和劣勢(shì) 反射的應(yīng)用場(chǎng)景 反射的優(yōu)勢(shì)和劣勢(shì) ??個(gè)人理解,反射機(jī)制實(shí)際上就是上帝模式,如果說方法的調(diào)用是 Java 正確的打開方式...

    浠ラ箍 評(píng)論0 收藏0
  • Java動(dòng)態(tài)性(2) - 之反射機(jī)制(Reflection)

    摘要:的動(dòng)態(tài)性反射機(jī)制動(dòng)態(tài)編譯動(dòng)態(tài)執(zhí)行代碼動(dòng)態(tài)字節(jié)碼操作動(dòng)態(tài)語言程序運(yùn)行時(shí)可以改變程序得結(jié)構(gòu)或變量類型典型語言等如下代碼不是動(dòng)態(tài)語言但有一定的動(dòng)態(tài)性我們可以利用反射機(jī)制字節(jié)碼操作獲得類似動(dòng)態(tài)語言的特性的動(dòng)態(tài)性讓編程的時(shí)候更加靈活反射機(jī)制反射機(jī)制指 1.Java的動(dòng)態(tài)性 反射機(jī)制 動(dòng)態(tài)編譯 動(dòng)態(tài)執(zhí)行JavaScript代碼 動(dòng)態(tài)字節(jié)碼操作 2.動(dòng)態(tài)語言 程序運(yùn)行時(shí),可以改變程序得結(jié)構(gòu)或變量...

    妤鋒シ 評(píng)論0 收藏0
  • Java 反射(Reflection)

    摘要:效率運(yùn)行效率使用反射減低程序的運(yùn)行效率。開發(fā)效率由于反射運(yùn)用到各個(gè)框架中,大大加快了開發(fā)的效率。 反射的核心就是Class對(duì)象,每一個(gè)類被jvm加載都會(huì)有一個(gè)對(duì)應(yīng)的class對(duì)象,這個(gè)class對(duì)象包含了這個(gè)類的結(jié)構(gòu)信息,反射就是會(huì)通過反射api反復(fù)操作這個(gè)class對(duì)象(屬性,方法,注解,構(gòu)造器,泛型),但是反射會(huì)降低程序的運(yùn)行效率,比普通方法要慢30倍,通過setAccessble...

    shengguo 評(píng)論0 收藏0
  • Java 反射教程

    摘要:反射非常強(qiáng)大和有用。另外,反射可以用在映射結(jié)果集的列名到對(duì)象的方法。本教程將深入介紹反射。本教程還將清除一些關(guān)于范型信息在運(yùn)行時(shí)可用性的認(rèn)知混淆。類對(duì)象使用反射時(shí),起點(diǎn)通常是需要使用反射檢視的類的對(duì)象。 Java反射可以在運(yùn)行時(shí)檢視類、接口、屬性和方法,而無需在編譯時(shí)知道類名、方法名等等。它也同樣使用反射支持實(shí)例化新的對(duì)象、調(diào)用方法和get/set屬性值。 Java反射非常強(qiáng)大和有用...

    klivitamJ 評(píng)論0 收藏0
  • Java反射Java 泛型基礎(chǔ)

    摘要:筆記來源反射綜述類的使用方法的反射成員變量的反射構(gòu)造函數(shù)的反射類加載機(jī)制類的使用在面向?qū)ο蟮氖澜缋铮f事萬物皆對(duì)象。 筆記來源:IMOOC 反射 Java Reflect 綜述 Class類的使用 方法的反射 成員變量的反射 構(gòu)造函數(shù)的反射 類加載機(jī)制 Class 類的使用 在面向?qū)ο蟮氖澜缋铮f事萬物皆對(duì)象。 但在Java里面有兩樣?xùn)|西不是對(duì)象:靜態(tài)的成員、普通數(shù)據(jù)類型類...

    seanHai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<