我想用main方法创建一个抽象类,以防止扩展它的开发人员必须实现main方法。我还想控制main方法中发生的事情。
我正在编写的抽象基类扩展NanoHTTPD
,并通过调用ServerRunner.run()
启动服务器,参数是您想要的类类型的类对象运行
这是我到目前为止所做的:
public abstract class FlexibleServer extends NanoHTTPD
{
public DeadSimpleMicroserver(int port)
{
super(port);
}
public static void main(String[] args)
{
ServerRunner.run(FlexibleServer.class);
}
}
问题是,由于这个类是抽象的,未来的开发人员将扩展类,所以我需要ServerRunner.run()
的参数作为子类的ACTUAL类型,所以我不能使用{ {1}}。
我尝试将参数更改为this.class,但后来我得到编译错误" this"无法从静态上下文引用(因为FlexibleServer.class
是静态的)。
如何从main()
获取实际子类的类对象?
答案 0 :(得分:1)
如果您要在运行时传递的类是动态的,则不能使用硬编码的类名称来调用它。您必须将调用更改为run
,以便将其传递给实际类的实例,或者您必须动态加载给定的类,例如,主方法参数。
通过上述更改,您的问题就会得到解决。
例如,如果您正在动态加载该类:
ServerRunner.run(Class.forName(args[0]));
假设将使用实际的类名称调用应用程序。
替代方案包括重新设计代码,以便调用者传入类名,实例或类对象
答案 1 :(得分:0)
我曾经使用的框架有一个像这样的基类,我们添加了一个这样的方法:
public abstract class FrameworkServer {
// framework stuff
protected static void main(String[] args, FrameworkServer instance) {
// parse args
// actually start the instance running
}
}
特定的服务器实例需要添加自己的main
方法,如下所示:
final class MyServer extends FrameworkServer {
public static void main(String[] args) {
main(args, new MyServer());
}
}
每个服务器都有一小部分样板,但这样可以避免反射并使代码更清晰。作为奖励,具体的子类现在可以将自己的参数添加到其服务器的构造函数中,这对于单元测试通常非常有用。