如何通过父类SuperFoo统一子类Foo1/Foo2/Foo3重复的main方法?
解决方案:复用父类的通用逻辑
你完全可以通过反射在父类SuperFoo中实现一个通用的main方法,让所有子类无需重复编写相同的代码。另外也有非反射的简化方案,下面分别介绍:
方案一:反射实现通用父类main方法
这个方案让父类负责创建子类实例并调用bar(),子类不需要自己编写main方法——要注意的是:Java中静态方法不会被继承,不过我们可以通过反射获取当前运行的子类类名,从而动态创建实例。
父类实现(带反射逻辑)
class SuperFoo { public static void main(String[] args) { try { // 获取当前运行的子类类名 String className = Thread.currentThread().getStackTrace()[1].getClassName(); Class<? extends SuperFoo> clazz = Class.forName(className).asSubclass(SuperFoo.class); // 创建子类实例并调用bar() SuperFoo instance = clazz.getDeclaredConstructor().newInstance(); instance.bar(); } catch (Exception e) { e.printStackTrace(); } } // 父类定义bar方法(如果是抽象方法可以强制子类实现) public void bar() { // 父类默认实现,子类可重写 } }
子类如何使用
现在子类只需要专注实现自己的bar()逻辑,完全不用写main:
class Foo1 extends SuperFoo { @Override public void bar() { System.out.println("Foo1's bar method executed"); } }
运行时直接执行子类的全类名(比如java Foo1),JVM会调用父类的main方法,自动反射创建Foo1实例并执行bar()。
方案二:非反射的简化方案(更安全直观)
如果你不想依赖反射,也可以把通用逻辑抽成父类的静态方法,子类的main只需要一行代码调用它,既避免重复又保持代码清晰:
父类实现
class SuperFoo { public static <T extends SuperFoo> void run(Class<T> clazz) { try { T instance = clazz.getDeclaredConstructor().newInstance(); instance.bar(); } catch (Exception e) { e.printStackTrace(); } } public void bar() { // 默认实现 } }
子类实现
class Foo1 extends SuperFoo { public static void main(String[] args) { SuperFoo.run(Foo1.class); } @Override public void bar() { System.out.println("Foo1's bar method executed"); } }
额外优化:强制子类实现bar方法
如果所有子类都必须自定义bar()逻辑,建议把SuperFoo设为抽象类,bar()定义为抽象方法,这样能强制子类实现,避免遗漏:
abstract class SuperFoo { // ... 上面的main或run方法 ... public abstract void bar(); // 子类必须实现此方法 }
内容的提问来源于stack exchange,提问作者Joshua Snider
相关产品推荐
相关产品推荐

