【问题标题】:Java - isntantiate with reflection does not workJava - 用反射实例化不起作用
【发布时间】:2013-11-10 10:02:15
【问题描述】:

为什么这个有效:

NormalChair nc = new NormalChair("a", 4);
    System.out.println(nc.getName());

输出:一个

而这个没有:

Object nc_ref = Class.forName("test.NormalChair").getConstructor(String.class, Integer.class).newInstance("a",4);
Method m_get = nc_ref.getClass().getDeclaredMethod("getName");
System.out.println(m_get.invoke(nc_ref));

我明白了:

Exception in thread "main" java.lang.NoSuchMethodException: test.NormalChair.<init>(java.lang.String, java.lang.Integer)
    at java.lang.Class.getConstructor0(Class.java:2800)
    at java.lang.Class.getConstructor(Class.java:1708)
    at test.Test.main(Test.java:37)

【问题讨论】:

  • 鉴于下面的答案,您介意发布构造函数的代码吗?这将确保我们有一个完整的问题和合理的答案,这反过来可能对搜索类似问题的人非常有用。谢谢!

标签: java reflection instantiation


【解决方案1】:

没有看到构造函数我不能确定,但​​我怀疑你想要int.class,而不是Integer.class。 (是的,这是合法的!)

Object nc_ref = Class.forName("test.NormalChair").getConstructor(
    String.class, int.class).newInstance("a", 4);

【讨论】:

  • 更改为 int.class,现在出现此错误:Exception in thread "main" java.lang.NoSuchMethodException: test.NormalChair.getName() at java.lang.Class.getDeclaredMethod(Class.java:1994) at test.Test.main(Test.java:39)
  • @Andrius 如果getName() 继承自父类,则必须使用getMethod 而不是getDeclaredMethod -- getDeclaredMethod 不会搜索父类。
  • 哦,谢谢,我现在才知道:)。不过会选择你的答案。
【解决方案2】:

我猜构造函数NormalChair("a", 4)是把Stringint作为输入参数吧?

在这种情况下,我认为正确的调用是getConstructor(String.class, int.class)

区别是int.class 不是Integer.class

希望对您有所帮助。

【讨论】:

    【解决方案3】:

    发现问题所在。看来我需要使用getMethod(),而不是getDeclaredMethod(),因为它没有看到该方法,甚至认为它被声明为公共。也许是因为它继承了父类的方法?如果我错了,请纠正我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      相关资源
      最近更新 更多