我有以下代码来检索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中仍然是可能的,还是禁止以这种方式修改可见性?
在早期的原型中,它曾经是可能的,但现在已经不可能了。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的旧帖子,但两个来源都