首頁>Program>source

一个簡單的問题,如何使此代碼起作用?

public class T {
    public static void main(String[] args) throws Exception {
        new T().m();
    }
    public // as mentioned by Bozho
    void foo(String... s) {
        System.err.println(s[0]);
    }
    void m() throws Exception {
        String[] a = new String[]{"hello", "kitty"};
        System.err.println(a.getClass());
        Method m = getClass().getMethod("foo", a.getClass());
        m.invoke(this, (Object[]) a);
    }
}

輸出:

class [Ljava.lang.String;
Exception in thread "main" java.lang.IllegalArgumentException: wrong number of arguments
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
最新回復
  • 5月前
    1 #

    Test.class.getDeclaredMethod("foo", String[].class);
    

    有效.問题是 getMethod(..) 只搜尋 public 方法.来自javadoc:

    Returns a Method object that reflects the specified public member method of the class or interface represented by this Class object.

    Update: 成功获取方法後,可以使用以下方法呼叫它:

    m.invoke(this, new Object[] {new String[] {"a", "s", "d"}});
    

    即-建立一个新的 Object 一个元素的陣列- String 陣列.使用您的變數名,它看起来像:

    m.invoke(this, new Object[] {a});
    

  • 5月前
    2 #

    //優先編輯:

    您的問题是 getMethod 尋找一个 public 成員。

    来自 Class.getMethod (強調我的):

    Returns a Method 反映指定 public的物件 此Class物件表示的類或介面的成員方法

    因此,您有两種選擇:

      Make public void foo(String... s) 並使用 getMethod

      使用 getDeclaredMethod 代替

      請註意, getField/s存在相同的區別 vs維兹威兹 和 getDeclaredField/s vs維兹威兹


      // getConstructor/s 問题

      這特別讨厌,但是發生的是那个 getDeclaredConstructor/s 如果您需要將引用型別的陣列作為唯一引數傳遞,則將變得棘手,因為它可以強製轉換為 invoke ,即使應该將其包裝在 invoke(Object obj, Object... args)中 代替。

      您可以這樣做:

      Object[]
      

      這绕過了vararg機製.更簡潔地說,您也可以這樣做:

      new Object[1]
      

      投向 m.invoke(this, new Object[] {a}); // Bohzo's solution 使vararg機製為您建立陣列。

      通過 m.invoke(this, (Object) a);時也需要技巧 作為varargs的引數,与反射無關。

      Object
      
      null

  • 解決Android不再支援的CanvasclipPath()
  • python:標識符中的字元無效