首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java 11中实现checkMemberAccess(SomeClass.class,Member.DECLARED)

如何在Java 11中实现checkMemberAccess(SomeClass.class,Member.DECLARED)
EN

Stack Overflow用户
提问于 2021-08-15 18:51:18
回答 1查看 77关注 0票数 0

给定以下Java8代码,如何在Java11中实现这一点?checkMemberAccess()方法已被新的checkPermission()方法所取代。

代码语言:javascript
复制
Java 8 code:

SecurityManager securityManager = System.getSecurityManager();
securityManager.checkMemberAccess(SomeClass.class, Member.DECLARED);

我想确保我们不能在SomeClass上调用java.lang.Class#getDeclared*()

我知道Java11现在有一个SecurityManager.checkPermission()方法,问题是,如何在特定的类上使用这个方法来检查我是否拥有"accessDeclaredMembers"权限。

我发现了this类似的问题,但它并没有告诉我太多。

EN

回答 1

Stack Overflow用户

发布于 2021-08-16 09:56:48

你写的

我知道Java11现在有一个SecurityManager.checkPermission()方法…

但这种方法存在于Java 2之后,也被称为“JDK Reversion1.2”。从那时起,其他check…方法仅为向后兼容性而存在,并委托给checkPermission方法。自Java 2以来,the documentation of the checkMemberAccess method始终包含以下描述:

默认策略是允许访问公共成员,以及访问与调用方具有相同类加载器的类。在所有其他情况下,此方法使用checkPermission权限调用RuntimePermission("accessDeclaredMembers")

它准确地告诉您,当您想要拥有相同的逻辑而不调用此方法时,您必须做什么。

代码语言:javascript
复制
securityManager.checkPermission(new RuntimePermission("accessDeclaredMembers"));

除了已经记录在案的怪癖之外,比如当堆栈深度为4的调用方碰巧具有与目标类相同的类加载器时,总是接受访问。还要注意的是,这个Java 8版本包含一个不推荐的警告,描述了这些问题。

所以更大的问题是你想通过电话实现什么。你写的

我想确保我们不能在SomeClass上调用java.lang.Class#getDeclared*()

但是,该方法并不“确保”无论“我们”是谁都不能访问成员,它只检查当前调用方(堆栈深度为4)是否可以访问指定类的方法。

要确保这种访问是不可能的,您必须确保潜在的调用者已经被不同的类加载器加载(正如文档所述,由同一个类加载器加载的类总是获得访问权)。然后,您必须配置一个安全管理来撤销RuntimePermission("accessDeclaredMembers")。由于您不知道checkMemberAccess与该权限之间的关系,我想您从未这样做过。

在尝试使用安全管理器来阻止这种访问之前(如果可能的话,在您的项目设置中),我必须警告您,那时您可能会坐立不安。以这种方式限制代码活动的JDK 17 is going to deprecate the entire SecurityManager for removal.将被删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68794500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档