1. 程式人生 > >newInstance() java.lang.InstantiationException 錯誤

newInstance() java.lang.InstantiationException 錯誤

學習 《Think in java》型別資訊練習1:

       刪除反射建立的類的預設無參建構函式時,使用Class.newInstance()時,報錯: java.lang.InstantiationException

部分程式碼如下:

package classtoy;
public class FancyToy extends Toy implements HasBatteries, Shoots, Waterproof {
    public FancyToy() {
        super(1);
}
}

package classtoy;
public class Toy {
    Toy
(int i) { } }
package classtoy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class ToyTest {
    static void printInfo(Class cc) {
        System.out.println("Class name:" + cc.getName());
System.out.println("is Interface:" 
+ cc.isInterface()); System.out.println("Simple name:" + cc.getSimpleName()); System.out.println("Canonical name:" + cc.getCanonicalName() + "\n"); } public static void main(String[] args) { Class c = null; try { c = Class.forName("classtoy.FancyToy"); } catch (ClassNotFoundException e) { e.printStackTrace();
System.exit(1); } printInfo(c); Arrays.stream(c.getInterfaces()).forEach(ToyTest::printInfo); Class up = c.getSuperclass(); Object obj = null; try { obj = up.newInstance(); // Constructor constructor = up.getDeclaredConstructor(int.class); // obj = constructor.newInstance(1); } catch (IllegalAccessException | InstantiationException e) { e.printStackTrace(); System.exit(1); } // catch (NoSuchMethodException | InvocationTargetException e) { // e.printStackTrace(); // } printInfo(obj.getClass()); } }

這裡Toy類預設為int引數建構函式,因為newInstance()方法只能呼叫無參建構函式,所以建立例項失敗即報錯 java.lang.InstantiationException。

如果使用Constructor.newInstance() 

修改程式碼即可正常執行:

package classtoy;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
public class ToyTest {
    static void printInfo(Class cc) {
        System.out.println("Class name:" + cc.getName());
System.out.println("is Interface:" + cc.isInterface());
System.out.println("Simple name:" + cc.getSimpleName());
System.out.println("Canonical name:" + cc.getCanonicalName() + "\n");
}

    public static void main(String[] args) {
        Class c = null;
        try {
            c = Class.forName("classtoy.FancyToy");
} catch (ClassNotFoundException e) {
            e.printStackTrace();
System.exit(1);
}
        printInfo(c);
Arrays.stream(c.getInterfaces()).forEach(ToyTest::printInfo);
Class up = c.getSuperclass();
Object obj = null;
        try {
//            obj = up.newInstance();
            //獲取引數型別為int的宣告式建構函式
Constructor constructor = up.getDeclaredConstructor(int.class);
obj = constructor.newInstance(1);
} catch (IllegalAccessException | InstantiationException e) {
            e.printStackTrace();
System.exit(1);
} catch (NoSuchMethodException | InvocationTargetException e) {
            e.printStackTrace();
}
        printInfo(obj.getClass());
}
}

這裡注意的是獲取宣告建構函式時需要加上對應引數型別calss可變引數,方能獲取到相同引數的建構函式

    通過反射建立新的類示例,有兩種方式: 
    Class.newInstance() 
    Constructor.newInstance() 


    以下對兩種呼叫方式給以比較說明: 
    Class.newInstance() 只能夠呼叫無參的建構函式,即預設的建構函式; 
    Constructor.newInstance() 可以根據傳入的引數,呼叫任意構造建構函式。 


    Class.newInstance() 丟擲所有由被呼叫建構函式丟擲的異常。 


    Class.newInstance() 要求被呼叫的建構函式是可見的,也即必須是public型別的; 

    Constructor.newInstance() 在特定的情況下,可以呼叫私有的建構函式。

相關推薦

newInstance() java.lang.InstantiationException 錯誤

學習 《Think in java》型別資訊練習1:       刪除反射建立的類的預設無參建構函式時,使用Class.newInstance()時,報錯: java.lang.InstantiationException部分程式碼如下:package classtoy; p

怎麽解決java.lang.NoClassDefFoundError錯誤

崩潰 用戶應用 ted 可用 基於xml配置 線程 拋出異常 mvc框架 gic 前言 在日常Java開發中,我們經常碰到java.lang.NoClassDefFoundError這樣的錯誤,需要花費很多時間去找錯誤的原因,具體是哪個類不見了?類明明還在,為什麽找不到?而

java.lang.NumberFormatException 錯誤及解決辦法

sys main rgs 方法 cep integer rim parse pack package com.geelou.test; public class ErrTest { public static void main(String[] args

java.lang.NullPointerException錯誤的解決方案

都是 參考 分割線 評論 service exception com 語句 img java.lang.NullPointerException空指針異常是像我一樣新手很容易出現的問題,這個問題一般情況都是不細心的時候出現的,開始正文如下: 1、業務層面的錯誤:   a、沒

java.lang.InstantiationException: class has no zero argument constructor

java.lang.InstantiationException: class has no zero argument constructor 需要在一個方法中的for迴圈中獲取圖片處理進度,在Fragment中顯示。在該方法的for迴圈中採用傳送廣播的方法,在Fragment中接收進度資

新安裝的eclipse匯入之前maven專案執行java.lang.ClassNotFoundException錯誤的解決

java.lang.ClassNotFoundException的解決方法 解決方法: 其他原因: 類找不到的原因會有很多,我就最近換了臺電腦後,重新安裝了eclipse等等等東西,然後匯入近原來電腦上執行好好的maven專案後,報出java.l

java.lang.NullPointerException錯誤原因及解決思路

本機環境是在myeclipse2017報錯 錯誤資訊可能是這樣,很多時候碰到這樣錯誤,不知道該怎麼入手,下面是報空指向異常的其中一種情況 十一月 27, 2018 11:13:08 上午 org.apache.catalina.core.StandardWrapperValve invoke

invalid LOC header 與 Could not publish to the server. java.lang.IndexOutOfBoundsException 錯誤處理

1. 專案eclipse 部署問題 Could not publish to the server. java.lang.IndexOutOfBoundsException 原因: pom.xml 依賴的jar包有錯誤,maven 下載jar時,檔案為下載文章

關於怎麽解決java.lang.NoClassDefFoundError錯誤

replace 模塊操作 模塊 mage 編譯 為什麽 man 而不是 找不到 很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException這兩個錯誤搞混,事實上這兩個錯誤是完全不同的。 NoCla

java.lang.NoClassDefFoundError 錯誤解決思路

Process: com.oppo.reader, PID: 20472 java.lang.NoClassDefFoundError: com.zhangyue.iReader.PDF2.ui.PDFCatalogView$PageChangedL

eclipse中報Error occurred during initialization of VM java/langClassDefFoundError: java/lang/Object錯誤

在eclipse中報一直報Error occurred during initialization of VM java/langClassDefFoundError: java/lang/Object錯誤; 或者是eclipse新增tomcat7.0刪除後,發

eclipse報錯:[Click the icon to add star.] Internal Error: java.lang.NullPointerException -----錯誤解決方法

linux系統下,eclipse出現以下報錯 [Click the icon to add star.] Internal Error: java.lang.NullPointerException的解決辦法 1、首先關閉MyEclipse工作空間。 2、然後刪除工作空間下的

處理java.lang.NoClassDefFoundError錯誤

一般出現出現jar包缺失,或者版本不對,都會提示ClassNotFoundException。這次出現這個發先還是jar包丟失,啟動springcloud專案的時候發現Caused by: java.lang.NoClassDefFoundError: Could not i

java.lang.NoSuchMethodError 錯誤分析

今天部署專案替換了兩個檔案,然後就出現了下面的問題 type Exception report message Handler processing failed; nested exception is java.lang.NoSuchMethodError: co

執行jar包出現java.lang.NoSuchMethodError錯誤

出現這種錯誤是由於jar包程式中有兩個以上的相同類名檔案,在打成jar的過程中,相同的類名檔案會被忽略。所以解決方法是,如果要用到兩個相同的類名檔案時,可以將檔案類名更改成不一樣的。

啟動Tomcat時報監聽器類(實現這個 ServletContextListener介面)引起的java.lang.ClassNotFoundException錯誤

最近在新匯入的一個maven專案中,出現以下問題:、 啟動Tomcat時自己寫的監聽器類(實現這個 ServletContextListener介面)引起的java.lang.ClassNotFoundException錯誤,一直報自己寫的這個類找不到。 原因分析,可能有

Spring整合mybatis:Caused by: java.lang.IllegalArgumentException錯誤

java.lang.IllegalArgumentException     at org.springframework.asm.ClassReader.<init>(Unknown Source)     at org.springframew

Hibernate一對多查詢物件時報java.lang.StackOverflowError錯誤(堆疊溢位)解決方案

問題: 自己建了一張客戶的表和訂單表,平常都沒問題,今天居然丟擲堆疊溢位的問題,百思不得其解。最後發現原因是兩個物件的toString方法重寫之後,應用程式遞迴太深了,所以發生了堆疊溢位。 java

java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseSelectProvider at org.mybati

錯誤 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method

hibernate出現Exception in thread "main " java.lang.ExceptionInInitializerError錯誤解決辦法

最近複習了下hibernate的內容,用於準備面試。另外看了下尚學堂的視訊,按照步驟去做了幾個實驗, 但是在這過程中遇到了以下錯誤問題: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bi