当前位置: 首页 > 知识库问答 >
问题:

为什么在这里获得java.lang.InstantiationException?[副本]

朱岳
2023-03-14
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test  {
    class Base {
        public Base() {}
        public void print(){
            System.out.println("base");
        }
    }

    class Derived extends Base {
        @Override
        public void print() {
            System.out.println("derived");
        }
    }

    public static void main(String args[])
    {
        try {
            Class.forName(Derived.class
                    .getTypeName())
                    .getSuperclass()
                    .getMethod("print", new Class[0])
                    .invoke(Base.class.newInstance());// line 41
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}
java.lang.InstantiationException: Test$Base
    at java.lang.Class.newInstance(Class.java:427)
    at Test.main(Test.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.NoSuchMethodException: Test$Base.<init>()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.newInstance(Class.java:412)
    ... 6 more

谁能告诉我为什么吗?类base的构造函数是public,但是编译器仍然声称找不到它的构造函数。

共有1个答案

通飞尘
2023-03-14

因为base是一个内部类,而所有(*)内部类构造函数都隐式声明索引为0的封闭类的形式参数。

一个(*)非私有内部成员类的构造函数隐式声明一个变量作为第一个形式参数,该变量表示类的紧邻实例(§15.9.2,§15.9.3)。

换句话说,它不是一个无参数的构造函数。您需要使用class#getConstructor(class[])来获取适当的构造函数,然后调用它。

Base instance = Base.class.getConstructor(Test.class).newInstance(new Test());
Class.forName(Derived.class.getTypeName()).getSuperclass().getMethod("print", new Class[0]).invoke(instance);
 类似资料:
  • 测试代码为: 测试代码为: 你知道怎么了吗?

  • 我遇到JSON解析错误。我的代码如下: 我从我的检查中得到以下错误: 由于:com,无法分析JSON。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN\u对象,但在第1行第2列为BEGIN\u数组 对于我试图读取的JSON,如果成功,我的应该返回5。 我做错了什么?

  • 我试图在Java做简单的聊天应用程序,但我得到这个错误。怎么了?我该怎么修好它?for循环中有一些错误? 我得到这个错误 线程“main”java.lang.IndexOutoFboundsException:索引0超出长度0的界限,位于java.base/jdk.internal.util.preconditions.OutoFbounds(preconditions.java:64)位于jav

  • 问题内容: 我应该开发一个简单的SFTP。 一切都进行得很好,直到我(在本例中)没有编写全部为止。可以请我解释一下,为什么系统挂在我身上吗? 服务器端: 客户端: 问题答案: 您的循环一直运行到流结束,但是对等方永远不会关闭套接字。该协议似乎要求打开套接字以供其他命令使用,因此您必须调整它的这一部分以包括一个长度字前缀,以便您知道要复制多少字节。 问题不是关于不写所有字节,而是关于阻塞in 。

  • 这是我的线程: 它得到一个上限和下限以及一个在所有线程上共享的结果。 这是我的测试类:

  • 我需要帮助我的错误就像 代码: