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

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

在 Java 中使用反射來設置方法的參數

在 Java 中使用反射來設置方法的參數

慕仙森 2022-10-26 17:19:20
我正在嘗試實現近似于以下內容:public class MyClass<E>{    protected MyClass(Object[] variables)    {        //init    }    public MyClass(Comparator<? super E> comp, Object[] variables)    {        //init    }    public static <K extends Comparable<? super K>, T extends MyClass<K>>          T construct(T example, Object[] variables)    {        return new T(variables);    }}Object[] 變量不是實際代碼,而是構造的實際參數的占位符。我的問題就在于此。我已經看到很多例子,無論有沒有反射,當 T 的構造函數的參數提前知道時如何做到這一點,因此可以在構造的參數中指定。但是,即使 T 的構造函數的參數未知,我也希望能夠做到這一點。有沒有辦法做到這一點?我并不特別關心解決方案是否使用反射,只要它有效,但反射似乎是最有可能的選擇。作為一個整體,我對反思相當陌生,所以如果這個問題相當基本,我深表歉意。編輯:由于反饋無法動態設置construct()我想稍微改變問題的參數。假設受保護的構造函數具有類構造所需的參數,如果我使用vararg (public static <K extends Comparable<? super K>, T extends MyClass<K>>              T construct(T example, Object... variables))確保傳遞給變量的參數與構造函數所需的參數匹配的最佳方法是什么?我曾希望動態地執行此操作,因為編譯器本身會防止此類問題,但如果沒有這種可能性,我要求最好的替代解決方案。編輯:為澄清起見,這是我的實際目標:我希望 MyClass 接受擴展 Comparable 的參數化E或任何參數化,但傳入一個 Comparator。我可以簡單地通過構造函數實現第二個目標,但是為了讓 E 在第二種情況下對任何選項開放,我必須將它對任何選項開放。為了解決這個問題,我對通用構造函數進行了保護,并創建了一個公共靜態方法來強制 Comparable 實現并充當偽構造函數,返回類型為 MyClass,其中 K 是 Comparable。但是,當另一個類擴展 MyClass 時,這會導致問題。如果我事先知道繼承類將具有與 MyClass 相同的參數,那么我可以簡單地隱藏該方法并相應地更改返回類型。但是如果我想讓子類有不同的參數,那么我已經改變了方法的簽名,不能再用它來隱藏前一個,這意味著子類不僅可以返回自己的實例,還可以返回其父類的完全不同的實例。這是我想盡量避免的。
查看完整描述

3 回答

?
搖曳的薔薇

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

我認為你不需要進行反思。您只需要簡化您的需求并使用 java 和泛型的強大功能來滿足您的需求。這是根據您的第三次編輯的示例:


class MyClass<E> {

    private Comparator<MyClass<E>> comparator;


    public MyClass(List<Object> params, Comparator<MyClass<E>> comparator) {

        //init

        this.comparator = comparator;

    }


}

class  MyClassExtension extends MyClass<Integer> {


    public MyClassExtension(List<Object> params, Comparator<MyClass<java.lang.Integer>> comparator) {

        super(params, comparator);

    }

}

class  MyClassExtension2<E> extends MyClass<E> {


    public MyClassExtension2(List<Object> params, Comparator<MyClass<E>> comparator) {

        super(params, comparator);

    }

}


查看完整回答
反對 回復 2022-10-26
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

我想我自己可能已經意識到了一個潛在的解決方案,盡管我希望得到關于它的可行性的反饋。


public class MyClass<E>

{

    public MyClass(Comparable<? super E> example, E example2, Object[] variables) 

      throws IllegalArgumentException

    {

        if(!example.getClass().equals(example2.getClass())

        {

             throw new IllegalArgumentException();

        }

        //init

    }


    public MyClass(Comparator<? super E> comp, Object[] variables)

    {

        //init

    }

}

這個想法是 if 語句強制example成為與泛型 E 相同的類,并且example作為參數的存在強制該類實現 Comparable。


查看完整回答
反對 回復 2022-10-26
?
ibeautiful

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

這可能有效,但我不建議這樣做。請注意,要使其正常工作,必須不是example所有成員variablesnull


public static <K extends Comparable<? super K>, T extends MyClass<K>> 

     T construct(T example, Object[] variables) throws 

                 NoSuchMethodException,

                 SecurityException,

                 InstantiationException,

                 IllegalAccessException,

                 IllegalArgumentException,

                 InvocationTargetException 

{

    Objects.requireNotNull(example);


    Class<?>[] argTypes = new Class<?>[variables.length];

    for ( int i = 0; i < variables.length; ++i)

    {

        // This will NPE if variables[i] is null

        argTypes[i] = variables[i].getClass();

    }


    // This will throw, if constructor is not defined

    Constructor<?> constructor = example.getClass().getConstructor(argTypes);


    return (T) constructor.newInstance(variables);

}

通常,您正在做的事情可以通過創建一個創建特定類實例的工廠接口來實現。


查看完整回答
反對 回復 2022-10-26
  • 3 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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