如何通过反射调用指定类的readText方法,而非仅实例化对象?
如何通过反射调用目标类的readText()方法?
当然有可行的实现方式!你已经通过Class.forName()拿到了目标类的Class对象并完成了实例化,接下来只需要借助Java反射API获取对应的方法并调用即可。这里给你两种常用的实现方案:
方案一:直接通过反射调用方法
这种方式不需要额外定义接口,直接通过反射API操作:
try { // 1. 获取目标类的Class对象 Class<?> targetClass = Class.forName(gameGrid.getGameGridArray().get(0)[0]); // 2. 实例化对象(注意:Class.newInstance()已过时,推荐使用下面的方式) Object instance = targetClass.getDeclaredConstructor().newInstance(); // 3. 获取公共的readText()方法(因为你的方法是public修饰,所以用getMethod) Method readTextMethod = targetClass.getMethod("readText"); // 4. 调用方法,传入实例对象 readTextMethod.invoke(instance); } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) { // 按需处理各种可能的异常 e.printStackTrace(); }
小细节说明:
- 如果
readText()是带参数的方法,需要在getMethod()中补充传入参数的Class类型,比如getMethod("readText", String.class)。 - 要是方法是私有修饰,需要用
getDeclaredMethod()替代getMethod(),并调用readTextMethod.setAccessible(true)来打破访问限制。
方案二:借助接口实现类型安全调用
如果你的多个类都有类似的readText()逻辑,更推荐定义统一接口,让目标类实现它,这样代码更优雅且类型安全:
首先定义接口:
public interface TextReader { void readText(); }
修改你的D类实现该接口:
public class D implements TextReader { public D() { } @Override public void readText() { System.out.println("Yes"); } }
之后反射实例化后直接强转为接口类型,就能直接调用方法:
try { Class<?> targetClass = Class.forName(gameGrid.getGameGridArray().get(0)[0]); // 强转为TextReader接口,避免反射调用的繁琐 TextReader reader = (TextReader) targetClass.getDeclaredConstructor().newInstance(); // 直接调用方法,和普通对象调用无区别 reader.readText(); } catch (Exception e) { e.printStackTrace(); }
另外提醒一句:Class.newInstance()在Java 9及以上已经被标记为过时,它会直接抛出构造方法的所有异常;而getDeclaredConstructor().newInstance()会把构造方法的异常包装在InvocationTargetException中,异常处理更规范,所以优先使用后者。
内容的提问来源于stack exchange,提问作者Mert Yanık
相关产品推荐
相关产品推荐

