【问题标题】:How does one access a method from an external jar at runtime (part2)?如何在运行时从外部 jar 访问方法(第 2 部分)?
【发布时间】:2009-08-25 04:38:29
【问题描述】:

这是How does one access a method from an external jar at runtime?帖子的延续

McDowell 回复了代码:

public class ReflectionDemo {

public void print(String str, int value) {
    System.out.println(str);
    System.out.println(value);
}

public static int getNumber() { return 42; }

public static void main(String[] args) throws Exception {
   Class<?> clazz = ReflectionDemo.class;
   // static call
   Method getNumber = clazz.getMethod("getNumber");
   int i = (Integer) getNumber.invoke(null /* static */);
   // instance call
   Constructor<?> ctor = clazz.getConstructor();
   Object instance = ctor.newInstance();
   Method print = clazz.getMethod("print", String.class, Integer.TYPE);
    print.invoke(instance, "Hello, World!", i);
  }
}

我添加了以下方法:

public void print2(String[] strs){
  for(final String string : strs ){
      System.out.println(string);
  }
}

并修改 main 以包含这两行:

Method print2 = clazz.getDeclaredMethod("print2", new Class[]{String[].class});
print2.invoke(instance, new String[]{"test1", "test2"});

但是,不是看到

测试1
测试2

我得到以下异常:

线程“main”java.lang.IllegalArgumentException 中的异常:参数数量错误

我已经阅读了 Sun Java 教程,在调用之前我已经为参数提供了自己的对象,并且我已经重新加载了数组,但都没有成功。谁能解释我在这里做错了什么?

谢谢, 托德

【问题讨论】:

    标签: java reflection runtime


    【解决方案1】:

    这就是可变参数的问题!

    print2.invoke(instance, new Object[] { new String[] {"test1", "test2"}});
    

    【讨论】:

    • 是的,请注意,invoke 接受 (Object, Object...),这意味着从技术上讲,第二个参数应该是 Object[],因此您传递的所有参数都必须作为如上所示。呸。 :-D
    • @tackline,@brent,谢谢。在这方面,我在头发部门要轻松得多。胶水,我需要胶水!!
    猜你喜欢
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 2014-07-25
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多