抽象クラスがある場合は、具体的な匿名クラスを派生させて抽象クラスをインスタンス化できます。これは例です:JavaのClassオブジェクトに格納されている抽象クラスを匿名でインスタンス化する方法はありますか?
abstract class A {
abstract void hello();
}
A say = new A() { void hello() { System.out.println ("hello"); } }
say.hello(); // -> hello
クラスがClassオブジェクトに格納されている場合、同じ操作を行うにはどうすればよいですか?ここでの例である:
// -*- compile-command: "javac anon.java && java anon"; -*-
class anon
{
anon() throws Exception {}
abstract class AbstractClass
{
AbstractClass() throws Exception {}
abstract void id();
}
AbstractClass x = new AbstractClass()
{
void id() { System.out.println ("X"); }
};
Class<AbstractClass> abstractclass
= (Class<AbstractClass>)Class.forName ("anon$AbstractClass");
AbstractClass y = abstractclass.getConstructor().newInstance();
public static void main (String argv[]) throws Exception
{
anon main = new anon();
main.x.id(); // should print "X"
main.y.id(); // should print "Y"
}
}
最初のインスタンス(x)が正常に動作しますが、それは、具体的なクラスを派生することなく直接抽象クラスをインスタンス化しようとするため、第二(y)は失敗します。 Classオブジェクトのみを持つJavaでこれを行うにはどうすればよいですか?
待機。最初のコードで2番目の方法を実装しようとしましたか?私はそれがあまりにも機能しないと思う。なぜあなたはそのような抽象クラスをインスタンス化しようとしていますか?匿名クラスを作成すると、抽象クラス自体を拡張するのではなく、抽象クラスを実際に拡張してインスタンス化します。 –
y.id()は "Y"を出力しません。 – ceving
@ceving ..あなたのコメントが分かりましたか? –