1. 程式人生 > >為什麼反射機制要依賴類的無參構造方法

為什麼反射機制要依賴類的無參構造方法

本文轉載http://blog.sina.com.cn/s/blog_6151984a0100kwy0.html

反射機制出現的InstantiationException異常

做反射機制時,執行如下的語句:
Class class1 = Class.forName(className);
Object o1 = class1.newInstance();

出下面的異常:
Exception in thread "main" java.lang.InstantiationException: classtest.PersonServiceBean
    at java.lang.Class.newInstance0(Class.java:340)
    at java.lang.Class.newInstance(Class.java:308)
    at classtest.JustTest.classInstanceTest(JustTest.java:33)
    at classtest.JustTest.main(JustTest.java:13)
進行debug除錯:   
程式執行到Class.class檔案,
    try {
        Class[] empty = {};
           final Constructor<T> c = getConstructor0(empty, Member.DECLARED); 
                                    //執行到此句時,出noSuchMethod異常,跳到catch
                java.security.AccessController.doPrivileged
                    (new java.security.PrivilegedAction() {
                            public Object run() {
                                c.setAccessible(true);
                                return null;
                            }
                        });
                cachedConstructor = c;
            } catch (NoSuchMethodException e) {     //出現noSuchMethod異常
                throw new InstantiationException(getName());    
                     //丟擲的是java.lang.InstantiationException
            }
        }

分析:
說明沒有對應的Method,顯然應該是沒有對應的Constructor Method--無參構造方法
測試類本來沒有構造方法,那麼預設JAVA會自動生成一個無參構造方法.
但後來因為測試類加入了一個有參的構造方法,這樣JAVA就不再提供預設的無參構造.

解決:
顯示的定義一個無參構造方法

備註:InstantiationException也發生在對Interface,SuperClass呼叫反射機制例項化物件的時候.