Java - 如何限制特定方法的方法调用

2024-04-01

我有一个特殊的要求,我需要确保只允许一个类中的特定方法调用第二个类中的公共(非静态)方法。不能使用继承。

一种选择是使用 StackTrace,如下所示:

A类.java

package org.rnd.stack;


public class ClassA {
    public void methodA() throws IllegalAccessException {
        Exception fake = new Exception("FAKE-IGNORE");
        StackTraceElement[] stack = fake.getStackTrace();
        StackTraceElement st = stack[1];
        if ("org.rnd.stack.ClassB".equals(st.getClassName())
                && "methodB".equals(st.getMethodName())) {
            System.out.println("You are allowed to call");
        } else {
            throw new IllegalAccessException("You are not allowed to call");
        }
    }
}

B类.java

package org.rnd.stack;

public class ClassB {
    public void methodB() throws IllegalAccessException {
        new ClassA().methodA();
    }

    public void illegalMethod() throws IllegalAccessException {
        new ClassA().methodA();
    }

    public static void main(String[] args) {
        try {
            new ClassB().methodB();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

现在上述解决方案工作正常,但由于代码审计中的质量控制,我需要提出另一个(或更确切地说)更好的解决方案。有更好的方法来实现这一目标吗?


正确的做法是重新审视您的要求。只能由某些其他代码路径调用的方法不兼容public。一般的最佳实践是使用包私有来防止外部调用者,并接受包中的任何代码could调用该方法,但不会,因为您或您的团队正在审核它。

方法可见性最终并不是阻止执行的安全解决方案;有人拥有您的 .class 文件并能够在计算机上执行它们,他们几乎可以做任何他们想做的事情。您不应该花费太多时间尝试锁定方法调用。相反,请清楚地记录该方法的意图(例如“辅助函数methodB(),请勿在其他地方使用。“)并相信与您一起开发的人知道他们在做什么。您甚至可以给该方法一个清晰的名称,例如dangerousMethodBForInternalUseOnly()如果你真的想在这件事上打败别人。

您也可能对。。。有兴趣依赖注入 http://en.wikipedia.org/wiki/Dependency_injection,这是一种使用类型系统来保护(而不是阻止)人们执行危险代码的设计模式。以下是关于 Guice(一种流行的 DI 框架)的一些讨论,其中更详细地介绍了该概念:

  • Google I/O 2009 - 使用 Guice 的大型模块化 Java https://www.youtube.com/watch?v=hBVJbzAagfs
  • Java on Guice:依赖注入,Java 方式 https://www.youtube.com/watch?v=0iSB0L9avmg

综上所述,作为一项学术练习,这里有一个将方法调用限制为固定数量的代码路径的选项 - 依赖共享秘密。添加一个Object secret字段到您的锁定方法,并导致该方法失败,如果通过secret与硬编码值不匹配(private static final Object SECRET = new Object())。然后,您可以使用其他机制仅将秘密共享给您允许的代码路径(例如,在锁定类中使用静态初始化程序将其发布到您明确信任的类)。

显然,恶意开发人员仍然可以解决这个问题,而且这非常恶心,但它会提供某种锁定行为,假设您可以相信您的锁定类不会在您不知情的情况下更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 如何限制特定方法的方法调用 的相关文章

随机推荐

  • 比较 D3.js 中的两个时间对象

    在 D3 js 中 我目前正在尝试根据数据数组是否包含该时间来填充一个空数组 数组仅包含每 5 分钟后的时间戳 如果数据数组包含时间 则应复制该值 否则为 null 但是当我尝试比较两个时间对象时它无法正常工作 以下是代码 当前代码不是复制
  • Android 在来电时关闭媒体服务

    我对 android 和 java 真的很陌生 我正在制作一个应用程序 它有一个媒体服务 我希望媒体在来电时停止或暂停 这是我的媒体服务代码 公共类 ServiceMusic 扩展服务 MediaPlayer music Override
  • “Mac 开发者”和“第三方 Mac 开发者应用程序”之间的区别

    有什么区别Mac Developer and 3rd Party Mac Developer Application配置文件在Code Signing Identity 哪一个适用于 Mac App Store 分发 我也为此摸不着头脑有一
  • CURLOPT_FOLLOWLOCATION 无法激活[重复]

    这个问题在这里已经有答案了 所以我在多个服务器上不断收到这个恼人的错误 它是一个警告 所以我会忽略它 但我需要该功能 警告 curl setopt function curl setopt 当启用 safe mode 或在第 56 行 ho
  • 为android中的应用程序制作小部件

    我已经在android中做了一个应用程序 现在我的要求是我想为此应用程序制作一个小部件 我已经做了一个Widget Demo 但我不知道如何通过小部件图标启动我的应用程序 请给我一个方法来做到这一点 任何帮助将不胜感激 主要类别 publi
  • 将 CLR 类型转换为 void* 并返回

    例如 如何正确转换 CLR 类型Foo to void 过一段时间再回来 场景是 我在 DLL 中有一些非托管代码 可以总结为 class Handler void obj void call void obj int detail voi
  • 使用 JavaScript 获取给定月份的给定工作日

    我试图获取某个日期所在月份的第 n 个工作日 例如 第二个星期日 例如 如果日期是 2015 年 8 月 24 日 我想这样做 nthDayOfMonth 0 2 new Date 2015 7 24 并获取 2015 年 8 月 9 日
  • iPhone REST 客户端 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AlertDialog 中的 Android EditText 似乎太宽

    下图中的 EditText 似乎太宽了 我假设我以某种方式滥用了 SDK 除非确信 否则我不会寻找一种方法来指定边缘 填充像素的数量EditText 这个看起来比较合适 这是我的代码 创建第一个 创建标签 对话框 final Dao
  • websphere - CWWKE0054E 错误无法打开文件

    我正在尝试从命令行运行 websphere liberty profile 服务器 我正在按照此处所述的步骤进行操作 https developer ibm com wasdev downloads liberty profile usin
  • netstandard20 中的 System.Data.Linq

    我有一个引用 Net 4 6 项目的 netstandard20 项目 除了我调用 Net 4 6 项目中的任何功能之外 所有项目都会编译和运行 我收到以下错误 FileNotFoundException 无法加载文件或程序集 System
  • 自动运行 CSS 更改

    我知道有解决方案可以解决这个问题 但我想在我的 自己的 你必须知道你的限制 Hello stackoverflow 路径上完成这项工作 所以我想要一种轮播 只要用户不将鼠标悬停在 ul 区域上 整个 ul 元素就会在每个设定的时间间隔内获得
  • group by 和 group concat ,不使用main pk优化mysql查询

    我的例子是 MYSQL 版本是 5 6 34 日志 Problem摘要以下查询需要40秒 订单商品 table has 758423 records And PAYMENT table has 177272 records And 提交条目
  • LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”

    public List
  • 选项卡更改时刷新/重新加载 MUI WPF 页面

    我正在使用 WPF 的 Modern UI 开发桌面应用程序 当我转到新标签页时 我尝试刷新我的标签页 但我做不到 当我使用选项卡控制器转到另一个页面时 我想刷新我的 MUI WPF 选项卡页面 谁能帮我 我不太清楚你的意思到底是什么 但是
  • 将字符串中保存的数字中的每个数字转换为 int 数组

    我正在 DFA 上编写这个项目 我想将保存为字符串的整数的每个数字保存并转换为 int 数组 这是负责此操作的函数的代码 int l final states size int temp final temp final new int l
  • 覆盖 Rails 中的 MIME 类型

    我想将 Rails 中的 JSON MIME 类型 application json 覆盖为 text x json 我尝试在 mime types rb 中再次注册 MIME 类型 但这不起作用 有什么建议么 Thanks 这应该可以工作
  • c2512 错误:没有合适的默认构造函数可用

    即使我声明了构造函数 我也遇到了 c2512 错误 我的代码是这样的 在我的 first h 文件中 我将其声明为 class myClass public tmpM cv Mat model 然后在我的 first cpp 中我做了 in
  • 从 Word OLE 应用程序对象获取应用程序标题

    有没有办法从 Word Application OLE 对象获取窗口标题 我想用它来尝试使用窗口FindWindow 我正在创建一个 OLE 对象并添加一个现有文档 如下所示 App CreateOLEObject Word Applica
  • Java - 如何限制特定方法的方法调用

    我有一个特殊的要求 我需要确保只允许一个类中的特定方法调用第二个类中的公共 非静态 方法 不能使用继承 一种选择是使用 StackTrace 如下所示 A类 java package org rnd stack public class C