亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從.class調用對象的 toString() 方法(類<?>)

從.class調用對象的 toString() 方法(類<?>)

慕尼黑5688855 2022-08-17 17:07:48
我有一個名為“Test”的類,我正在將其傳遞給一個方法,該方法的類型為。Test.classClass<T> clazz我需要從該 clazz 變量調用類 Test 的 toString() 方法。我們可以使用反射來做到這一點,而不會對測試進行類型轉換嗎?
查看完整描述

2 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

首先從 clazz 變量創建對象,然后調用該對象的方法。toString()

clazz.newInstance().toString();

如果你有一個默認的構造函數,那么它也可以工作:

clazz.getConstructor().newInstance().toString();

更新:如果你想做一般的測試函數,那么你必須實現這樣的測試函數。

public void TestToString(Object obj,String expectedVal){
    assertEquals(obj.toString(),expectedVal);
  }


查看完整回答
反對 回復 2022-08-17
?
達令說

TA貢獻1821條經驗 獲得超6個贊

不能對參數調用方法。這只是類的描述,但要調用方法,您需要實例化該類。
您可以:
- 使用反射創建.class參數的實例以調用該方法
,或者
- 使用反射來調用實例上的方法。Class

但底線是,你需要一個實例。

還有一點評論(正如Joachim Sauer已經說過的那樣):
方法存在于類上,并且所有內容都擴展了類,因此它始終可用。
不需要反射,泛型或轉換。您只需在類中重寫此方法即可。toString()ObjectObject

一個小例子來演示調用String()的不同方法:

public class Test {


    private String name = "unnamed";


    public Test() {}


    public Test(String name) {

        this.name = name;

    }


    public void setName(String name) {

        this.name = name;

    }


    public String toString() {

        return name;

    }


    public static <T> T doReflectionCreateToString(Class<T> clazz) {

        try {

            T newT = clazz.getConstructor(String.class).newInstance("Name 2");

            System.out.println("Created by reflection:    "+ newT);

            return newT;

        } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException

                | NoSuchMethodException | SecurityException e) {

            e.printStackTrace();

        }

        return null;

    }


    @SuppressWarnings("unchecked")

    public static <T, E> E doReflectionCall(T obj, String methodName, Object[] arguments, Class<E> returnClazz) {

        try {

            Class<?> clazz = obj.getClass();

            Method myMethod = clazz.getDeclaredMethod(methodName);

            return (E) myMethod.invoke(obj, arguments);

        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {

            e.printStackTrace();

        }

        return null;

    }


    public static <T> void doGenericToString(T obj) {

        System.out.println("toString by Generic way:  "+ obj);

    }


    public static void main(String[] args) {

        Test t = new Test();

        t.setName("Name 1");


        System.out.println("toString by standard way: "+ t);


        doGenericToString(t);


        System.out.println("Called by reflection:     "+ doReflectionCall(t, "toString", new Object[]{}, String.class));


        Test newT = doReflectionCreateToString(Test.class);

        System.out.println("Returned by reflection:   "+ newT);

    }

}

哪些輸出:

按標準方式 toString: 名稱 1
to按通用方式排列: 名稱 1
由反射調用: 名稱 1
由反射創建: 名稱 2
由反射返回: 名稱 2

如您所見,無論是通過標準方式還是通過泛型或更糟糕的反射,都會導致相同的邏輯。
我希望這能啟發你(和其他人);)


查看完整回答
反對 回復 2022-08-17
  • 2 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號