本文介绍如何在抽象基类的 static main 方法中,不依赖硬编码,自动发现并实例化所有具体子类,从而实现“一次编写、多子类复用”的命令行计算工具。核心在于运行时类路径扫描与反射创建对象。
在 Java 中,抽象类本身无法被直接实例化,但其具体子类(如 MOne、MTwo)可以。问题的关键在于:基类 Calculation 的 main 方法如何在不预先知道子类名称的前提下,动态加载并调用当前运行的子类实例? 直接在 Calculation.main() 中 new MOne() 显然不可行——这会破坏抽象性,且无法适配 java MTwo 5 这类调用。
实际上,java MOne 5 并不会执行 Calculation.main(),而是执行 MOne 类的 main 方法(若存在);而 MOne 继承自 Calculation 但未重写 main,因此 JVM 会沿继承链向上查找,最终执行 Calculation.main() —— 这是可行的前提。但此时 Calculation.main() 需要识别“当前正在被哪个子类触发”,而非盲目扫描全部子类。
✅ 正确思路是:利用 JVM 启动时的入口类信息,通过 StackTraceElement 或更可靠的方式获取当前主类(即 MOne/MTwo),再通过反射实例化它。
以下是推荐的轻量、可靠、无需额外依赖的实现:
立即学习“Java免费学习笔记(深入)”;