gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:20 25 4
gpt4 key购买 nike

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

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 中执行此操作?

最佳答案

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

关于java - Java中如何匿名实例化存储在Class对象中的抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com