Java如何在循环中调用指定选中的多个方法以优化代码
Java循环调用指定类选定方法的实现方案
你之前反射代码报错的核心原因有两点:
getMethod()入参只需要传方法本身的名称,你传入的"objA.doSomethingA"带了对象实例前缀,类中不存在该名称的方法,自然获取失败Method.invoke()第一个参数需要传入方法归属的对象实例,你之前传入了字符串变量,参数不匹配
下面给两种可直接落地的实现,都只会调用你明确指定的方法,不会扫描加载类中全部方法:
方案1:Java 8+ 方法引用(优先推荐)
和你参考的Python存方法引用的逻辑完全一致,不需要反射、不需要处理一堆受检异常,编译期就能校验方法是否存在,不会出现运行时找不到方法的问题。
import java.util.List; class B { public void test() { // 原有test逻辑保持不变 } public void verifyMyMethods() { A objA = new A(); // 仅将需要调用的A类方法引用加入列表,增减方法直接修改该列表即可 List<Runnable> targetMethods = List.of( objA::doSomethingA, objA::doSomethingB, objA::doSomethingC // 需要调用其他方法直接追加,比如 objA::verifySomethingXYZ ); for (Runnable method : targetMethods) { method.run(); test(); } } } class A { public void doSomethingA() {} public void doSomethingB() {} public void doSomethingC() {} public void verifySomethingXYZ() {} public void verifySomethingLMN() {} }
这个方案的优势:
- 代码极简,哪怕要调用10-20个方法,也只需要在列表里追加一行方法引用,不需要重复写
objA.xxx(); test();的冗余代码 - 类型安全,方法名写错、参数不匹配在编译阶段就会报错,不用等到运行时排查
- 不会加载类中其他未被列入列表的方法,完全符合你的需求
方案2:修正后的反射实现(适合方法名需要动态配置的场景)
如果你需要从配置、外部输入读取要调用的方法名,可以用修正后的反射逻辑,注意只把需要调用的方法名(不带实例前缀)加入列表即可:
import java.lang.reflect.Method; import java.util.List; class B { public void test() { // 原有test逻辑保持不变 } public void verifyMyMethods() { A objA = new A(); // 仅填入需要调用的方法名,不要带objA.前缀 List<String> targetMethodNames = List.of( "doSomethingA", "doSomethingB", "doSomethingC" ); for (String methodName : targetMethodNames) { try { Method method = objA.getClass().getMethod(methodName); method.invoke(objA); test(); } catch (Exception e) { // 不要空吞异常,建议打印日志方便定位问题 e.printStackTrace(); } } } }
注意:反射方案没有编译期校验,方法名拼写错误只会在运行时抛出异常,没有动态配置需求的话优先选择方法引用方案。
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

