如何匿名实例化存储在Java中的Class对象中的抽象类?

cev*_*ing 6 java reflection

如果你有一个抽象类,你可以通过派生一个具体的匿名类来实例化它.这是一个例子:

abstract class A {
     abstract void hello ();
}

A say = new A () { void hello () { System.out.println ("hello"); } }

say.hello(); // -> hello
Run Code Online (Sandbox Code Playgroud)

如果类存储在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"
    }
}
Run Code Online (Sandbox Code Playgroud)

第一个实例化(x)工作正常但第二个(y)失败,因为它试图直接实例化抽象类而不派生具体类.如何在只有Class对象的Java中执行此操作?

Mar*_*nik 5

您可能对匿名类的工作原理存在误解.一个匿名类实际上是一个普通类,就像任何其他类一样,并且有自己的类文件.Java-the-language只为此提供了一些语法糖,并允许通过在自己的文件中声明常规命名的顶级类来完全模仿某些东西的详细语法.这就是为什么您会发现Reflection API对您想要实现的目标毫无用处.基本上,您希望动态创建一个没有类文件的类.为此,您需要一个合适的库,例如javassist.