Java 拓展读物 反射机制 04 类内方法的处理
作者:谎言诞行    发布时间:2025年02月15日

这里我们将展开讲述Java中如何通过反射机制调用一个对象的类内方法。在开始之前,我们先看看测试类中的类内方法定义。如下图:

image.png

通过上图,我们可以看出,类内部有4种不同的方法。如果按照性质区分,大体如下:

(1)公有静态方法2个(一个有参,一个无参)

(2)私有静态方法2个(一个有参,一个无参)

(3)私有普通方法2个(一个有参,一个无参)

(4)公有普通方法2个(一个有参,一个无参)

在常规的程序中,公有方法在外部程序是可以访问,也就可以调用。而私有方法,外部程序不可访问,也就不能调用。然而,在反射机制中,我们可以突破语法限制,直接调用私有方法

常规调用

在开始使用反射之前,我们先看看常规的写法如何调用类和对象内部的方法。

image.png

这里我们再通过代码提示,看看私有方法是否可以查看到

image.png

反射调用

下面我们展示如何使用反射调用对象和类的内部方法。主要分为2个部分:普通方法的调用 以及 静态方法的调用。

(1)调用普通方法

image.png

(2)调用类内静态方法

image.png

通过上面的代码,大家应该已经看出,如何通过反射调用类和对象的内部方法了。当中有几点还是需要说明一下:

(1)获取类的Class对象,除了通过Class.forName方法之外,还可以通过已有对象的getClass方法获取。如果已经明确是哪个类,则直接调取class引用也是可以的。

(2)获取方法Method对象,需要通过getDeclaredMethod 方法才可以获取所有的方法。getMethod 方法只能获取到公共的方法。

(3)调用类和对象的方法时,对于私有方法需要先将可访问性设置为true值。触发执行的处理,通过Method对象的invoke方法处理。Method对象的invoke方法都需要传入一个object参数,它就是要操作的具体对象。如果操作的是类内部定义的静态方法,object参数传入null值即可。

最后,我们讲下关于反射机制使用中,可能发生的异常。(在测试代码中,为了代码简洁,没有对异常捕捉处理,只是简单地抛出)

(1)NoSuchMethodException - 如果未找到匹配方法。

(2)NullPointerException - 如果方法名为 null 或者 如果指定的对象为 null,并且方法是实例方法。

(3)SecurityException - 如果存在安全管理器 s,并且满足一些条件。

(4)IllegalAccessException - 如果此Method对象正在强制Java语言访问控制,并且底层方法不可访问。

(5)IllegalArgumentException - 如果该方法是实例方法,并且指定的对象参数不是声明底层方法的类或接口(或其子类或实现者)的实例;如果实际参数和形式参数的数量不同;如果原始参数的解包转换失败;或者,在可能展开后,参数值无法通过方法调用转换转换为相应的形式参数类型。

(6)InvocationTargetException - 如果底层方法引发异常。

(7)ExceptionInInitializerError - 如果此方法引发的初始化失败。

另外,如何获取所有的方法对象。我们可以按照以下的方式来处理:

image.png


本节结束

填写一种颜色的字符(不区分大小写),1分钟有效,点击图片刷新