利用反射來獲得方法、成員

沒什么好說的代碼。要注意的是
1.獲得方法的修飾符的方法:Modifier.toString(met[i].getModifiers()) 它原本是用數(shù)字來表示的。比如說public是1,這里要用Modifier來把相應(yīng)的數(shù)字轉(zhuǎn)換成對應(yīng)的修飾符
2.獲得參數(shù)用的是Class<?> params[] = met[i].getParameterTypes();

interface Message {
    public abstract void print();
}

abstract class info {
    public abstract void get();
}

class MessageImpl extends info implements Message {

    @Override
    public void get() {
    }

    @Override
    public void print() {
    }

    public void set() {
    }

}

public class TestDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.demo.MessageImpl");
        Method met[] = cls.getMethods(); // cls.getMethods()獲得的是所有的方法包括繼承來的。
        for (int i = 0; i < met.length; i++) {
            System.out.print(
                    Modifier.toString(met[i].getModifiers()) + " " + met[i].getReturnType().getSimpleName() + " ");
            System.out.print(met[i].getName() + "(");
            Class<?> params[] = met[i].getParameterTypes();
            for (int j = 0; j < params.length; j++) {
                System.out.print(params[j].getSimpleName() + " " + "arg");
                if (j < params.length - 1) {
                    System.out.print(",");
                }
            }
            System.out.print(")");
            Class<?> exp[] = met[i].getExceptionTypes();
            if (exp.length > 0) {
                System.out.print(" throws ");
                for (int j = 0; j < exp.length; j++) {
                    System.out.print(exp[j].getSimpleName() + " ");
                    if (j < exp.length - 1) {
                        System.out.print(",");
                    }
                }
            }
            System.out.println();
        }
    }
}

以下是對方法的調(diào)用,一般來說我們要把類中的成員封裝。用invoke來調(diào)用。

import java.lang.reflect.Method;
import cn.mldn.util.StringUtil;

class Message {
    private String content;
    public String print(String str){
        return str;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
}

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String classname = "cn.mldn.demo.Message";
        String property = "content";
        String value = "北京下雨了";
        Class<?> cls = Class.forName(classname);
        Method setMet = cls.getMethod("set"+StringUtil.initcap(property), 
String.class);//這里必須固定好參數(shù)的類型,增加了耦合
        Method getMet = cls.getMethod("get"+StringUtil.initcap(property));
        Object obj = cls.newInstance();
        setMet.invoke(obj, value);
        System.out.println(getMet.invoke(obj));
    }
}

上面必須固定參數(shù)類型,我們可以通過Field類來優(yōu)化。

反射的reflect包中最核心的類一共有三個:Construct,Field,Method
Fidle就是成員。不要直接通過反射進(jìn)行屬性的調(diào)用。

field.setAccessible(true)

雖然這個方法可以破壞類的封裝,讓我們直接使用成員的值。但是不要用。

public class TestDemo {
    public static void main(String[] args) throws Exception {
        String classname = "cn.mldn.demo.Message";
        String property = "content";
        String value = "北京下雨了";
        Class<?> cls = Class.forName(classname);
        Field field = cls.getDeclaredField(property);
        Method setMet = cls.getMethod("set"+StringUtil.initcap(property), 
field.getType());//獲得成員的類型
        Method getMet = cls.getMethod("get"+StringUtil.initcap(property));
        Object obj = cls.newInstance();
        setMet.invoke(obj, value);
        System.out.println(getMet.invoke(obj));
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 整體Retrofit內(nèi)容如下: 1、Retrofit解析1之前哨站——理解RESTful 2、Retrofit解析...
    隔壁老李頭閱讀 4,798評論 2 12
  • Java反射 概述 Java反射機(jī)制可以讓我們在編譯期(Compile Time)之外的運(yùn)行期(Runtime)檢...
    Leocat閱讀 1,187評論 0 0
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,436評論 0 16
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,669評論 9 118
  • (對于不能相守的異地戀人,思念會象萬蟲噬咬,百蟻爬行。七夕來臨之際,僅以此詩,獻(xiàn)給所有不能相聚的“牛郎織女”,祝節(jié)...
    梅子的山園閱讀 494評論 7 3

友情鏈接更多精彩內(nèi)容