Java中已有类的Constructor对象,如何调用该类的run()方法?
问题原因
Constructor.newInstance() 方法的返回值类型为 Object,Java静态编译阶段会检查Object类是否存在run()方法,显然不存在,所以直接抛出编译错误,和运行时类信息无关。
解决方案
方案1:抽公共接口(推荐)
所有业务产品类都统一实现同一个带run()方法的公共接口,构造实例后强转成接口类型即可直接调用方法,类型安全且无额外性能损耗。
- 定义公共接口:
public interface Product { void run(); }
- 改造业务产品类实现接口:
public class product1 implements Product { public product1(Instances instance){ // 原有构造器逻辑 } @Override public void run(){ // 原有run方法逻辑 } }
- 调用逻辑调整:
Constructor<?> productConstructor; productConstructor = getProductConstructor(instance.getProductName()); // 构造实例后强转为公共接口调用run Product product = (Product) productConstructor.newInstance(new Object[] { instance }); product.run();
方案2:反射调用run方法
如果不想改动现有类结构,可以继续通过反射获取并调用run()方法:
Constructor<?> productConstructor; productConstructor = getProductConstructor(instance.getProductName()); Object productInstance = productConstructor.newInstance(new Object[] { instance }); // 反射获取run方法 Method runMethod = productInstance.getClass().getMethod("run"); // 调用方法 runMethod.invoke(productInstance);
注意:该方案需要额外处理
NoSuchMethodException、IllegalAccessException、InvocationTargetException等反射异常,且性能略低于接口实现方案。
额外优化建议
可以在调用前增加空判断,避免getProductConstructor返回null时触发空指针异常。
内容的提问来源于stack exchange,提问作者mcool
相关产品推荐
相关产品推荐

