我有以下代码段:
class You{
public You(String s){}
}
public static void main(String[] args) throws NoSuchMethodException {
Constructor[] constructors = You.class.getConstructors();
for(Constructor constructor: constructors){
Class[] parameterTypes = constructor.getParameterTypes();
for(Class c: parameterTypes){
System.out.println(c.getName());//print java.lang.String
}
}
Constructor constructor =
You.class.getConstructor(String.class);//NoSuchMethodException?
}
这很老了,当我打印构造函数时,它有一个以java.lang.String
作为参数的构造函数。但是当我尝试You.class.getConstructor
时,它说没有以String.class
作为参数的构造函数。
我在Mac上使用 java1.8 。您能帮您解释以及如何解决吗?
非常感谢。
答案 0 :(得分:3)
如果不是这种情况,我将删除此答案,但看起来You
是一个内部类,并且我怀疑您的实际代码看起来像这样:
public class Foo {
class You {
public You(String s){}
}
public static void main(String[] args) throws NoSuchMethodException {
Constructor[] constructors = You.class.getConstructors();
for (Constructor constructor: constructors) {
Class[] parameterTypes = constructor.getParameterTypes();
for (Class c: parameterTypes){
System.out.println(c.getName());//print java.lang.String
}
}
Constructor constructor =
You.class.getConstructor(String.class);//NoSuchMethodException?
}
}
来自Class#getConstructor
的{{3}}:
如果此Class对象表示在非静态上下文中声明的内部类,则形式参数类型包括显式的封闭实例作为第一个参数。
由于这个原因,您将不得不使用以下内容:
Constructor constructor = You.class.getConstructor(Foo.class, String.class);
但是显然Foo
替换为您的封闭类的名称。
答案 1 :(得分:2)
如果You
确实是一个内部类,那么您需要使它的构造函数有所不同。
如果此Class对象表示在 非静态上下文,形式参数类型包括显式 将实例作为第一个参数。
这意味着您还需要将封闭的类传递给Class.getConstructor
调用。
这里是一个示例(包括如何从其Constructor
创建内部类的实例):
public class Test {
class You{
public You(String s){}
}
public static void main(String[] args) throws NoSuchMethodException {
Constructor constructor =
You.class.getConstructor(Test.class, String.class);//NoSuchMethodException?
try {
You you = constructor.newInstance(new Test(), "");
} catch (Exception e) {
e.printStackTrace();
}
}
}
答案 2 :(得分:0)
getConstructors()
返回可见的构造函数。尝试getDeclaredConstructors()
或制作public
类。