Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用反射实例化受保护构造函数时出现NoSuchMethodException_Java_Reflection_Constructor_Protected - Fatal编程技术网

Java 使用反射实例化受保护构造函数时出现NoSuchMethodException

Java 使用反射实例化受保护构造函数时出现NoSuchMethodException,java,reflection,constructor,protected,Java,Reflection,Constructor,Protected,这是我第一次使用反射,不知道在实例化受保护的构造函数时犯了什么错误。下面是我实例化的构造函数的代码 getDeclaredConstructor导致NoSuchMethodException,尽管此异常类使用一个、两个和三个参数保护构造函数 final Constructor<JsonProcessingException> constructor = JsonProcessingException.class .getDeclaredConstructor

这是我第一次使用反射,不知道在实例化受保护的构造函数时犯了什么错误。下面是我实例化的构造函数的代码

getDeclaredConstructor导致NoSuchMethodException,尽管此异常类使用一个、两个和三个参数保护构造函数

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class
        .getDeclaredConstructor(Object.class, Object.class);
constructor.setAccessible(true);
最终构造函数=
JsonProcessingException.class
.getDeclaredConstructor(Object.class,Object.class);
constructor.setAccessible(true);

我的假设:我已经读到我们可以使用反射实例化私有构造函数,所以我假设也可以实例化受保护的构造函数。

您的方法几乎是正确的,但您正在尝试反射不存在的构造函数。例如,您必须传递正确的签名

JsonProcessingException.class
    .getDeclaredConstructor(String.class, Throwable.class)

您还必须考虑构造函数的参数类型,而不仅仅是数字。没有一个构造函数将两个

对象
作为参数,但有一个构造函数将
字符串
JsonLocation
作为参数,还有一个构造函数将
字符串
可丢弃
作为参数。要访问第二个构造函数,请按如下方式编写:

final Constructor<JsonProcessingException> constructor = 
    JsonProcessingException.class
        .getDeclaredConstructor(new Class[]{String.class, Throwable.class});
constructor.setAccessible(true);
JsonProcessingException ex = constructor.newInstance(msg, throwable);
最终构造函数=
JsonProcessingException.class
.getDeclaredConstructor(新类[]{String.Class,Throwable.Class});
constructor.setAccessible(true);
JsonProcessingException ex=constructor.newInstance(msg,throwable);

另请参见

未传递Object.class获取具有单个参数的任何构造函数的通用方法?@Vishwanathgowdak no(除非参数类型为true和
对象
)。你必须知道参数类型。如果需要不太严格的匹配,则应遍历
getDeclaredConstructors()
,以找到适合的构造函数