1

次のコードでは、java.lang.InstantiationException を取得しています。

(以下は、スタンドアロンでコンパイルされるコードを縮小したものです。私のアプリケーションでは、Enum->Class マップを維持し、ファイルから整数値を読み取るときに、マップを調べて適切なクラスをインスタンス化したいと考えています)。

エラーを取り除く方法は?構文の問題はありますか? インターフェイスを使用する必要がありますか? ここでの私の理解は限られています。

class Main {
    abstract class Base {
        Base() {};
        void print() {
            System.out.println("I am in Base");
        }
    }


    class D1 extends Base {
        D1() {};
        @Override 
        void print() {
            System.out.println("I am in D1");
        }
    }

    static Class<? extends Base> getMyClass() {
        return D1.class;
    }


    public static void main(String[] args) {
        try {
            Class<?> cc = getMyClass();
            Object oo = cc.newInstance();
            Base bb = (Base) oo; 
            bb.print();

        } catch (Exception ee) {
            System.out.println(ee);
        };
    }
};
4

2 に答える 2

5

コードには 2 つの問題があります。

  • BaseおよびD1非静的内部クラスです。これは、宣言クラス ( ) のフィールドとメソッドにアクセスできることを意味するMainため、 のインスタンスへの参照を保持する必要がありますMainMainしたがって、それらのコンストラクターには、その参照を渡すために使用される型の暗黙的な引数があります。したがって、引数なしのコンストラクターはありません。代わりに、単一引数のコンストラクターを使用する必要があります。

    Object oo = cc.getConstructor(Main.class).newInstance(new Main()); 
    

    または、単純に として宣言するstaticか、または外部で宣言することMainもできます。この場合、のメンバーにアクセスできず、Mainそれへの参照は必要ありません。

  • のコンストラクターは であるD1必要がありますpublicsetAccessible(true)それ以外の場合は、リフレクションのためにアクセスできるようにするために呼び出す必要があります。

于 2012-08-23T09:52:20.730 に答える
0

Baseクラスとクラスの両方がD1同時に内部クラスであるため、それらは非静的内部クラスであるため、メインクラス内にオブジェクト内部クラスを作成することでそれらのメソッドにアクセスでき、メインコンストラクター内でそれらのメソッドを呼び出すことができ、次のようになります..

class Main {   
      Main(){     
      D1 dd = new D1();  
      }  
      abstract class Base {  
          Base() {};  
          void print() {  
                System.out.println("I am in Base");  
          }  
      }
     class D1 extends Base {
          D1() {};
          @Override 
          void print() {
              System.out.println("I am in D1");
          }
     }

}

これがあなたを助けることを願っています..ありがとう

于 2012-08-23T10:56:52.280 に答える