使用反射,是否有一种可靠的方法来确定方法是否在给定的类中可见?

时间:2014-11-20 03:27:00

标签: java reflection visibility

在Java中,是否有一种简单,可靠的方法来确定通过反射传递的方法是否可以从给定的类中看到:即可以从给定的类调用该方法而不会导致IllegalAccessException抛出?

我知道可以在方法上调用setAccessible(true)来覆盖Java可见性约束,但我想确定它是否可见,而不是无论如何都要调用它。 isAccessible()类上的Method方法看起来很有希望,但这只是测试是否已调用setAccessible(true)

只是尝试调用该方法然后捕获IllegalAccessException也不是一个选项,因为这只会确定当前类的可见性,而不是任何给定的类。

到目前为止,我提出的唯一解决方案是做这样的事情:

public boolean isVisible(Method toBeCalled, Class<?> fromClass) {

    if (Modifier.isPublic(toBeCalled.getDeclaringClass().getModifiers()) && 
            Modifier.isPublic(toBeCalled.getModifiers())) {
        return true;
    }

    if (toBeCalled.getDeclaringClass().isAssignableFrom(fromClass) 
            && Modifier.isProtected(toBeCalled.getModifiers())) {
        return true;
    }

    if (fromClass.getPackage().equals(toBeCalled.getDeclaringClass().getPackage()) &&
            ! (Modifier.isPrivate(toBeCalled.getModifiers())) ) {
        return true;
    }

    return false;
}

这在一定程度上起作用,但我基本上编写了Java可见性规则,这需要大量的测试,而且我确信有很多边缘情况我没有考虑到像内在这样的东西类。

有谁知道一种简单,可靠的方法吗?

0 个答案:

没有答案