方法参数的编译时验证

2023-12-31

我在这里发现了一些类似的问题,但不完整的答案没有帮助,而且比澄清任何事情都产生了更多的混乱,所以我尝试给出一个更结构化的问题,并希望得到能够帮助更多用户的答案。

我的简化示例:我有一个带有两个不同构造函数的 Java 类

public class ObjectOfInterest {
  public ObjectOfInterest(String string, Integer int) { ... }
  public ObjectOfInterest(String string1, String string2) { ... }
  ...
}

我需要对这些构造函数的调用进行一些编译时验证。参数string2必须是一些文字,我想根据内容将调用标记为警告(即,当它不是文字或文字格式不正确时发出警告)。

不幸的是,使用 Eclipse 进行 Java 验证的文档并不容易理解,有时已经过时,在我看来,大多数情况下它都是不完整的,并且似乎没有足够短的工作示例可以在教程中使用。

My goal: 第一步:我想要一个验证器,用警告标记两个参数版本的调用 - 只是为了从某个地方开始并了解基础知识。

到目前为止我发现了什么: 我见过的几个例子public class MyValidator implements IValidator, ISourceValidator where IValidator需要实现一个方法public void validate(IValidationContext arg0, IReporter arg1) throws ValidationException并且似乎来自旧版本的验证框架(有时我发现只是带有注释的空方法useless), and ISourceValidator需要实现一个方法public void validate(IRegion arg0, IValidationContext arg1, IReporter arg2)- 这似乎是更新的版本。

然后你必须添加一些扩展点到一些plugin.xml(我不太清楚这个plugin.xml在哪里)。

我在黑暗中刺伤的地方: 完全不清楚如何使用IRegion, IValidationContext, and IReporter- 也许我走错了路,但我能得到什么?如何在验证中查找该构造函数的调用?

在第一步变得更加清晰之后,我会扩展这个问题。 Outlook,我想添加对构造函数的两个字符串版本进行快速修复的可能性,并以这种方式操作代码 - 但这至少提前了两个步骤,稍后会详细介绍。


首先我必须说你想要做什么超越了普通的 Java 编程。除了使用普通类型可以实现的方法之外,没有正常的方法在编译时进行验证。

你也想做的事超出了使用注释处理器所能完成的范围。注释处理器是一种半标准的处理器,因为它们是标准化的并且是 Java 框架的一部分。它们是在编译期间运行的类,它们作为输入签名类和方法的组成,可用于验证和代码生成。

如果你还该怎么做有不正常的方式, 然而:


Eclipse 插件解决方案

您似乎正在尝试的解决方案是编写一个使用 Eclipse Java 工具进行验证的 Eclipse 插件。这应该可行,我不知道它有多容易,并且验证仅适用于使用 Eclipse 的用户。


检查器解决方案

根据我(有限)的知识,似乎最好的工具是:

The 检查框架 https://checkerframework.org/用于静态分析。

它正是用于您想做的事情。它似乎有相当详细的文档并且易于设置。例如,它用于进行正则表达式语法的无效分析和编译时验证。有一个tutorial https://checkerframework.org/tutorial/webpages/encryption-checker-cmd.html这听起来和你的事情很相似。说明书上有一章是关于创建一个新的检查器 https://checkerframework.org/manual/#creating-a-checker.

使用这个来制定解决方案可能需要花费大量的时间和精力,但我也认为这看起来很有趣!

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

方法参数的编译时验证 的相关文章

  • 如何在谷歌地图中使用latlng字符串数组绘制多边形

    在我的应用程序中 我有包含 imagview 的 recyclerview 并且该 imageview 通过使用我存储在 sqlite 中的坐标包含静态地图图像 当我单击该图像时 我将该字符串数组格式的坐标传递给其他地图活动 然后使用该字符
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • JFreeChart - 创建移动图表时出现问题

    我在我的 java 应用程序中使用 JFreeChart Problem 我想绘制一个XY面积图 whose 域轴 x 轴 当我们开始绘制数据时应该自动水平滚动 我在中看到了同样的事情时间序列图表但我不想要任何时间系列图表 我只想要滚动的
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • 维护插入顺序的并发集合[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以维护插入顺序的并发列表 有人有什么好的推荐吗 我看一些番石榴 例如SetFromMa
  • “未找到 JAVA 路径。请检查 JAVA 是否已安装。”初始化 RSelenium 时出错

    我正在尝试启动一个 RSelenium 会话到 webscrape 但是 当运行此代码时 driver lt rsDriver browser c chrome chromever 76 0 3809 126 port 4444L 我收到此
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • 如何找到 Oracle 数据库的 URL?

    如何找到 Oracle 数据库的 URL 和端口 Example jdbc oracle thin host port dbName 用户名 密码 是否有我可以查看的 SQL 命令或日志 配置文件 对于甲骨文来说 有一个tnsnames o
  • java:如何设置全局线程ID?

    是否有可能为线程设置唯一ID 在分布式系统中 线程是在许多不同的机器上创建的 例如通过 RMI 我需要它来创建日志消息 根据我的研究 我知道可以使用 log4j mdc ndc 来完成 但只能在单线程中完成 我的问题是 在创建线程时必须设置
  • 如何使用键盘上的“删除”按钮作为从 JTable 中删除行的快捷方式[重复]

    这个问题在这里已经有答案了 可能的重复 如何制作删除按钮来删除JTable中的行 https stackoverflow com questions 13236206 how to make delete button to delete
  • 读取不失真的灰度 PNG 图像文件

    我需要读取和处理大量的灰度 PNG 文件 我的意思是 如果它们在 Photoshop 或 GIMP 中打开 则图像模式为灰度 而不是具有灰度值的 RGB 图像 ImageIO 似乎没有实现这一点 它似乎将所有图像文件视为 sRGB 这会破坏
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输
  • Spring Boot中服务接口类的用途

    我的问题是关于接口类的使用 我对 Spring 还很陌生 所以如果这过于简单 请耐心等待 首先 当您可以在 BoxService 中声明 find all 时 这里拥有 IBoxService 接口有什么意义 其次 在控制器中如何使用IBo
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List

随机推荐

  • Google App Engine 上的 Spring security openid

    有人知道如何让 Spring security openid 在 Google App Engine 上工作吗 我试过了 但是有一个java security AccessControlException access denied err
  • 在 spacy 的帮助下合并几乎相似的行

    如果某些行几乎相似 我想合并它们 可以使用 spaCy 检查相似性 df string yellow color yellow color looks like yellow color bright red color okay red
  • 将数据传递到 django 表单

    class Test forms Form def set choices self choices self choices choices def get choices self return self choices options
  • 查看 TeamCity 服务消息

    我正在对 TeamCity 9 0 4 中的构建步骤进行故障排除 问题似乎出在服务消息输出中 构建完成后可以查看这些吗 它们不包含在构建日志中 关于服务消息的文档简单地说In order to be processed by TeamCit
  • 使用 jQuery 获取锚元素的绝对 URL

    给定一个锚元素 类似于 a first 如何获取锚点指向的绝对URL 如果您使用的是 jQuery 1 6 您可以使用 prop a first prop href 1 6之前 您可以访问href直接在 DOM 元素上使用属性 a firs
  • 访问结果集行中的值,其中该值来自 MySQL 函数调用

    因此 由于普通的 PHP 查询返回一个数组 所以从未向我解释过当列值是 MySQL 函数调用的返回值时 如何实际从查询的结果集数组中提取值 countThemes Singlequery SELECT COUNT 1 FROM items
  • 如何正确增加 mongoDB 中的多个日期?

    我不是一个特别擅长 Javascript 的人 我在尝试更新很多内容时遇到了一些麻烦DateMongo 中的对象 看起来 inc尚未实施Date objects https jira mongodb org browse SERVER 31
  • Facebook OAuth api 登录问题

    我对用于登录的 Facebook API 感到困惑 我在网上找不到任何有用的信息 我的 FB 会话委托方法没有被调用 并且访问令牌和过期日期值没有被设置 所以我认为我从未登录过 我恢复到一个非常简单的应用程序 只有两个按钮 登录 注销 和一
  • openFrameworks 与处理

    我已经阅读了很多有关 openFrameworks 和 Processing 的内容 但仍然无法区分 除了一个是 C 中的 另一个是 Java 中的 有人能告诉我哪个具体是做什么用的吗 你是对的 一个是 C 另一个是 Java 这些差异适用
  • Graphql: "message": "ID 不能代表值: 5a72240cf31713598588b70f"

    I use moongose与 一起工作mongodb on nodejs基于应用程序 目前 我尝试实施Grapqhl基于API 我的查询graphql架构如下所示 const schema buildSchema type Query p
  • ng-show 当数组长度为零时

    我是 AngularJS 的初学者 我试图在过滤过程中在 的帮助下显示 未找到标签 ng show JS function simpleController scope scope tags HTML CSS Jquery Bootstra
  • 如何在 bookshelf.js 中获取 SQLSTATE?

    在与 PostgreSQL 或其他 RDBMS 通信时 如何检测 bookshelf js 中发生的错误类型 提示者 这个问题 https stackoverflow com q 43815157 398670 我自己不使用 bookshe
  • 如何在 PHP 中转义引号? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有那个代码 a href Add an Img a 我不知道如何把它放在这里echo code 这会起作用 已测试
  • 如何使用设置了“num_epochs”的“read_batch_examples”创建“input_fn”?

    我有一个基本的input fn可以与下面的 Tensorflow 估计器一起使用 无需设置即可完美运行num epochs范围 获得的张量具有离散形状 传入num epochs与其他任何事物一样None结果是未知的形状 我的问题在于在使用时
  • React-MobX 错误:“decorators”插件需要“decoratorsBeforeExport”选项,其值必须是布尔值

    我收到以下错误 如果您从 Babylon Babel 6 迁移或想要使用旧的装饰器提案 则应该使用 decorators legacy 插件而不是 decorators 包 json babel plugin proposal decora
  • 具有初始容量的 Powershell 哈希表

    我想知道你如何在 powershell 中声明具有初始容量的哈希表 我知道我想要它有多大 但我必须在循环中为其分配值 所以像这样 hashtable 100 杰伦 莫斯特 https stackoverflow com users 4137
  • Win32 与 .Net [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 NET 比 Win32 更好还是相反 两者的优缺点是什么 在什么情况下一个会比另一个更好 Microsoft 是否已发布 Net 作为 Win3
  • 离开同步块时自动notify()/notifyAll() [关闭]

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

    当我尝试安装 Microsoft Visual Studio 2015 时 出现错误 安装程序被阻止 告诉我 需要重新启动计算机才能继续安装 请重新启动计算机并再次运行安装程序 这样做了之后还是不行 我使用的是 Windows 10 Bui
  • 方法参数的编译时验证

    我在这里发现了一些类似的问题 但不完整的答案没有帮助 而且比澄清任何事情都产生了更多的混乱 所以我尝试给出一个更结构化的问题 并希望得到能够帮助更多用户的答案 我的简化示例 我有一个带有两个不同构造函数的 Java 类 public cla