Java反射中常用的操作方法

jopen 11年前發布 | 18K 次閱讀 Java Java開發

一、在JDK中,主要由以下來實現Java反射機制,這些類都位于java.lang.reflect包中:

Class類: 代表一個類;

Field類: 代表類的成員變量;

Method類: 代表類的方法;

Constructor類: 代表類的構造方法;

Array類:提供了動態創建數組,以及訪問數組元素的靜態方法。

二、以下以代碼進行解釋:

1) Java語言提供一種直接獲得Class實例的簡便快捷方式(當使用此技術時,裝入類涉及的所有工作都在內部進行):


Class clazz = MyClass.class;


但是,如果需要在運行時從某些外部源讀取類名時,就需要使用一個類裝入器來查找類信息,此時需要使用下面的方法:


String name = "MyClass";
Class clazz = null;
try {
     clazz = Class.forName(name);
} catch (ClassNotFoundException e) {
     e.printStackTrace();
}

2)如何使用Constructor、Field、及Method:

package com.test.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyClass {
    private String str1;
    private String str2;

    public MyClass(String s1, String s2) {
        str1 = s1;
        str1 = s2;
    }

    public String sayHello(String name) {
        return "Hello " + name ;
    }

    public static void main(String[] args) {
        try {
            //創建類的對象
            Class[] types = new Class[] {String.class, String.class};
            Constructor<MyClass> cons = MyClass.class.getConstructor(types);
            Object[] objs = new Object[] {"a", "b"};
            MyClass clazz =(MyClass) cons.newInstance(objs);
            System.out.println(clazz.toString());
            //創建類的方法

            //創建類的字段(獲得Class的字段信息不同于構造函數的調用,在參數類型數組中使用了字段名)
            Field field = MyClass.class.getDeclaredField("str1");
            //操作類的字段
            field.set(clazz, "xxx");
            System.out.println(field.get(clazz));

            //創建類的方法(獲得Class的方法信息與用于構造函數和字段的調用非常類似)
            Class[] types2 = new Class[] {String.class};
            Method method = MyClass.class.getMethod("sayHello", types2);
            //調用方法
            Object[] strs = new Object[] {"World"};
            Object result = method.invoke(clazz, strs);
            System.out.println(result.toString());
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

    public String getStr1() {
        return str1;
    }

    public void setStr1(String str1) {
        this.str1 = str1;
    }

    public String getStr2() {
        return str2;
    }

    public void setStr2(String str2) {
        this.str2 = str2;
    }
}


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!