当前位置: 首页 > 知识库问答 >
问题:

是否可以通过Jigsaw在Java9中通过反射访问包范围的方法?

高建本
2023-03-14

我有以下代码来检索http和https的默认URLStreamHandlers,它通过访问静态包作用域方法url.geturlStreamHandler(),在Java8中工作:

private URLStreamHandler getURLStreamHandler(String protocol) {
    try {
        Method method = URL.class.getDeclaredMethod("getURLStreamHandler", String.class);
        method.setAccessible(true);
        return (URLStreamHandler) method.invoke(null, protocol);
    } catch (Exception e) {
        logger.warning("could not access URL.getUrlStreamHandler");
        return null;
    }
}

这在jigsaw的Java9中仍然是可能的,还是禁止以这种方式修改可见性?

共有1个答案

翟柏
2023-03-14

在早期的原型中,它曾经是可能的,但现在已经不可能了。Jigsaw的可访问性规则现在只限制对public元素(类型、方法、字段)的访问。

在您的示例中,对method.setAccessible(true)的调用将失败,出现如下消息:

InAccessibleObjectException:无法使getURLStreamHandler可访问:模块Java....不“打开Java....”到未命名模块@1941A8FF

关于如何解决这个问题,请参见此问题。

 类似资料:
  • 问题内容: Java中是否可以通过反射访问私有字段str?例如获取该字段的值。 问题答案: 是。 然后,使用字段对象获取类实例上的值。 请注意,方法通常会使人们感到困惑。你有该字段,但没有该对象的实例。你必须将其传递给方法

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要

  • 问题内容: 我试图使用反射获取不可见类的实例,即AKA包私有类。我想知道是否有一种方法可以切换修饰符以使其公开,然后使用进行访问。当我现在尝试尝试时,它会阻止我说我做不到。不幸的是,没有该类的方法。 问题答案: 嵌套类 -在其他类(包括静态和非静态类)中定义的类 内部类 -非静态嵌套类(内部类的实例需要外部类的实例存在) 非嵌套(顶级)类 根据您的问题,我们知道您要访问的构造函数不是公共的。因此您

  • 为了能够 动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getConstructors() getConstructor(Class<?>…parameterTypes) getDeclaredConstructors() getDeclaredConstructor(Class<?>...parameterTypes) 如果是访问指定的构造方法,需要根据该构

  • 如何使用反射来区分类重载方法,例如: <代码>方法()和<代码>方法(int-arg) 并调用此函数: 它返回错误,这意味着默认情况下选择没有参数的方法。如果我调用没有int参数的方法,它将工作。我问如何区分重载的方法?我已经阅读了的文档https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html还有一个关于SO的旧帖子,但两个来源都