Think In Java——通过newInstance()获取实例

1.newInstance()是通过无参构造函数实例化的,如果无参构造函数不存在,在通过反射获得对象会抛出 java.lang.InstantiationException 异常

2.通过newInstance()获取内部类实例时,下面的代码会出错

public class Test {
    class Toy {
        Toy() {

        }

        Toy(int i) {
        }
    }

    public static void main(String[] args) {
        try {
            Object obj=Class.forName("Test$Toy").newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出
java.lang.InstantiationException: Test$Toy
	at java.lang.Class.newInstance(Class.java:427)
	at Test.main(Test.java:17)
Caused by: java.lang.NoSuchMethodException: Test$Toy.<init>()
	at java.lang.Class.getConstructor0(Class.java:3082)
	at java.lang.Class.newInstance(Class.java:412)
	... 1 more

这是因为newInstance()找不到Toy的构造函数。使用下面的代码即可解决此错误

public class Test {
    class Toy {
        Toy() {

        }

        Toy(int i) {
        }
    }

    public static void main(String[] args) {
        try {
            Object obj=Class.forName("Test$Toy").getDeclaredConstructors()[0].newInstance(new Test());
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

详情浏览 https://www.cnblogs.com/qquan/articles/4901107.html

猜你喜欢

转载自blog.csdn.net/chaos_le/article/details/81188105