Java反射 - 方法 Methods

使用Java反射,您可以檢查類(lèi)的方法并在運(yùn)行時(shí)調(diào)用它們。 這是通過(guò)Java類(lèi)java.lang.reflect.Method完成的。 本文將更詳細(xì)地介紹Java方法對(duì)象。

獲取方法對(duì)象

Method類(lèi)是從Class對(duì)象中獲得的。 這里是一個(gè)例子:

Class aClass = ...//obtain class object
Method[] methods = aClass.getMethods();

Method []數(shù)組對(duì)于在該類(lèi)中聲明的每個(gè)公用方法都將有一個(gè)Method實(shí)例。

如果您知道要訪問(wèn)的方法的確切參數(shù)類(lèi)型,則可以這樣做,而不是獲取數(shù)組的所有方法。 這個(gè)例子返回一個(gè)名為“doSomething”的公共方法,該方法以String為參數(shù):

Class  aClass = ...//obtain class object
Method method =
    aClass.getMethod("doSomething", new Class[]{String.class});

如果沒(méi)有方法匹配給定的方法名稱(chēng)和參數(shù),在這種情況下String.class,拋出一個(gè)NoSuchMethodException。

如果您嘗試訪問(wèn)的方法不帶參數(shù),請(qǐng)將null作為參數(shù)類(lèi)型數(shù)組,如下所示:

Class  aClass = ...//obtain class object
Method method =
    aClass.getMethod("doSomething", null);

方法參數(shù)和返回類(lèi)型

你可以閱讀一個(gè)給定的方法是這樣的參數(shù):

Method method = ... // obtain method - see above
Class[] parameterTypes = method.getParameterTypes();

你可以像這樣訪問(wèn)一個(gè)方法的返回類(lèi)型:

Method method = ... // obtain method - see above
Class returnType = method.getReturnType();

使用方法對(duì)象調(diào)用方法 invoke

你可以調(diào)用像這樣的方法:

//get method that takes a String as argument
Method method = MyObject.class.getMethod("doSomething", String.class);

Object returnValue = method.invoke(null, "parameter-value1");

null參數(shù)是要調(diào)用該方法的對(duì)象。 如果方法是靜態(tài)的,則提供null而不是對(duì)象實(shí)例。 在這個(gè)例子中,如果doSomething(String.class)不是靜態(tài)的,則需要提供一個(gè)有效的MyObject實(shí)例而不是null;

Method.invoke(Object target,Object ... parameters)方法接受可選數(shù)量的參數(shù),但是您必須為要調(diào)用的方法中的每個(gè)參數(shù)提供一個(gè)參數(shù)。 在這種情況下,這是一個(gè)采取字符串的方法,所以必須提供一個(gè)字符串。

實(shí)戰(zhàn)

package com.reflection.detail;

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

/**
 * Created by Fant.J.
 * 2018/2/7 15:04
 */
public class Reflection_Methods {
    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        //獲取所有的共有方法
        Class aClass = People.class;
        Method [] methods = aClass.getMethods();

        //獲取知道方法名稱(chēng)和參數(shù) 的方法,   如果沒(méi)有參數(shù),則傳入null
        Method method = aClass.getMethod("setName", String.class);
        Method method1 = aClass.getMethod("getName",null);

        //根據(jù)method獲取參數(shù)類(lèi)型
        method.getParameterTypes();
        //根據(jù)method獲取返回值類(lèi)型
        method.getReturnType();

        /**
         *  使用反射來(lái)調(diào)用方法。如果方法是靜態(tài)方法,則不需要實(shí)例該對(duì)象。
         *  因?yàn)槲疫@里這個(gè)方法不是靜態(tài)的。所以我實(shí)例化People對(duì)象
         *  仔細(xì)看看method和method1 是啥。代表了啥
         */
        People people = new People();
            method.invoke(people,"Fant.J");
            Object obj = method1.invoke(people,null);
            System.out.println(obj);
    }
}

結(jié)果

Fant.J

項(xiàng)目代碼:github鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,637評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,533評(píng)論 19 139
  • 臺(tái)灣葉果Aigo2017-6月上海培訓(xùn)會(huì)圓滿落幕,期待9月廣州見(jiàn)喔~
    袁瑀澴閱讀 527評(píng)論 0 0
  • 231e3fe90634閱讀 189評(píng)論 0 0
  • 如果能在開(kāi)滿映山紅的山坡 與你相遇 如果能在溪水潺潺的河岸邊 與你相遇 ...
    魚(yú)兒得水閱讀 370評(píng)論 0 2

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