首页>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)
最新回答
  • 2021-1-11
    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});
    

  • 2021-1-11
    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:标识符中的字符无效