是否可以获取所有实现接口的类? [复制]

2024-03-29

我可以通过反思或类似的方式来做到这一点吗?


没有 100% 可靠的方法可以做你想做的事。原因是 Java 中类加载的工作方式。

Java 中的类是“按需”加载的。第一次在代码中引用类(无论是静态还是动态)时,JVM 将使用当前的类加载器并尝试加载它。 ClassLoader 没有提供可以从中加载的所有类的方法,因此您无法迭代类。

有一些不可靠的解决方法。例如,如果您知道 ClassLoader 只会从特定目录或特定 JAR 文件中加载类,那么您可以使用与文件系统相关的类来查找可用的“.class”文件,然后您可以加载所有内容(这需要时间并且会消耗大量 PermGen,这可能是一个问题 - 请记住,您无法轻松卸载类!(除非您执行一些 ClassLoader 魔法)),并使用反射来过滤实现您的类界面。

此解决方法的问题在于,如果您更改部署,它很可能会停止工作。例如,如果您开始部署 JAR 文件,然后您决定使用处理 WAR 文件的 servlet 容器,您的代码可能不再工作。

如果你真的想尝试这种方法,有一个名为反思 https://code.google.com/p/reflections/这可能有用。

The 我实现过的最可靠的方法是使用注释处理器。您编写一个注释,注释您的接口,然后编写一些将由编译器在编译时执行的代码,这些代码将收集实现您的接口的类并将它们的名称保存在资源文件中。然后,您使用读取该文件的方法编写一个类,并为该资源文件中列出的每个类名提供一个 Class 对象。

这种方法的问题是,只有在我的构建过程中编译的类才会被列出(即,如果您发布带有接口的库并期望其他人实现您的接口,那么这种方法将没有用,因为您的代码将永远不知道其他项目中的类)。如果这对您来说足够了,就像对我来说一样,那么这个解决方案可以完美地工作。我可以在具有 WAR(爆炸或未爆炸)部署的 Servlet 容器中、在可执行 jar 中使用它,等等。它将永远有效。

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

是否可以获取所有实现接口的类? [复制] 的相关文章

  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 如何降低圈复杂度?

    我正在开发一个将 RequestDTO 发送到 Web 服务的类 我需要在发送请求之前验证该请求 请求可以从 3 个不同的地方发送 并且每个 请求类型 有不同的验证规则 例如请求1必须有姓名和电话号码 请求2必须有地址等 我有一个 DTO
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • H264 字节流到图像文件

    第一次来这里所以要温柔 我已经在给定的 H 264 字节流上工作了几个星期 一般注意事项 字节流不是来自文件 它是从外部源实时提供给我的 字节流使用 Android 的媒体编解码器进行编码 当将流写入扩展名为 H264的文件时 VLC能够正
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • org.postgresql.util.PSQLException:协议错误。会话设置失败

    我知道这些类型的问题已经存在 但提供的解决方案对我不起作用 在我的应用程序中 没有版本不匹配的黑白驱动程序和 PostgreSQL 服务器 我还没有找到任何其他解决方案 我正在使用 PostgreSQL 服务器 9 4 和 postgres
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • 如何屏蔽 Protobuf 中的某些字段

    我找不到一种方法来屏蔽 protobuf 结构中的某些字段 我确实阅读了有关 FieldMaskUtil 的内容并尝试了几个示例 但它似乎做了相反的操作 即复制 FieldMask 中提到的字段 这与我想要的不同 这是示例结构和相应的测试代
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • 尝试在空对象引用上调用虚拟方法“java.lang.String org.jsoup.nodes.Element.ownText()”

    我正在使用下面的代码来获取版本名称 from 应用商店通过使用 jsoup 我正在获取详细信息 但它引发了一些异常 我的代码是 public class ForceUpdateAsync extends AsyncTask
  • Netty中连接关闭后重新连接的最佳方法是什么

    简单场景 扩展 SimpleChannelUpstreamHandler 的较低级别的类 A 此类是发送消息和接收响应的主力 系统其他部分可以使用顶级类 B 来发送和接收消息 可以模拟同步和异步 此类创建 ClientBootstrap 设
  • NoSuchMethodError:将 Firebase 与应用程序引擎应用程序集成时

    我试图将 firebase 实时数据库与谷歌应用程序引擎应用程序集成 我在调用时收到此错误 gt DatabaseReference ref FirebaseDatabase gt getInstance gt getReference t
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • 无法在 BlackBerry Playbook 上设置音量

    我在更改黑莓游戏书的音量时遇到问题 首先 我将 Android 应用程序重新打包到 Palybook 应用程序 我需要使用搜索栏更改黑莓剧本的音量 并在搜索监听器中设置音频管理器音量 这是代码 audioManager AudioManag
  • 当我在 Java 中输入 IP 时无法连接到我的服务器

    好的 我正在尝试学习 Java 客户端 服务器的内容 并且正在浏览教程代码 如下所示 当我将 localhost 更改为我的 IP 时 它会停止工作 请帮忙 编辑 127 0 0 1 似乎也可以工作 但不是我的真实IP Copyright

随机推荐

  • 如何在 iOS 应用程序中创建自定义委托

    在 iPhone 中 每个 UIContrrol 都有预定义的委托方法 但是我们如何创建自己的自定义委托方法 在你的头文件中 之前 interface insert protocol YourDelegate
  • 按数组中的多个属性对对象进行分组,然后对它们的值求和

    按多个属性对数组中的元素进行分组 https codereview stackexchange com questions 37028 grouping elements in array by multiple properties是与我
  • React-Native-Table-Component 冻结可滚动表中的第一列和第一行

    期望状态 我正在使用react native table component 这是一个在 React Native 中渲染表格的基本组件 我需要冻结表中的第一列和第一行 以便滚动时它们保持在视图中 具体来说 我需要在水平滚动时第一列保持固定
  • gradle 1.10 内部 Maven 存储库在 intellij 13 中永远索引

    我有两个项目 一个 Maven 和一个 Gradle 该公司还有一个内部 Maven 存储库 我正在尝试设置 Gradle 以使用内部存储库 使用 Intellij 13 当我将像这样的存储库添加到 build gradle 中的 Grad
  • Maven 依赖项:树未显示所有传递依赖项

    我无法理解该人的行为依赖 树输出 当在更高的模块上运行插件时 我丢失了它所依赖的模块的重要信息 但是当我在较低的模块上运行插件时 我可以看到依赖项 这是一个显示问题的示例 名称已更改 mvn pl foo bar application d
  • 非 Windows 世界中的 COM?

    希望这个问题不会太含糊 通读 COM 规范和 Don Box 的 Essential COM 书 有很多关于 COM 解决的问题 的讨论 它们听起来都很重要 相关且重要 current https stackoverflow com que
  • React 组件未渲染到index.html

    我真的是 ReactJS 的初学者 组件没有渲染 我浪费了很多时间来搜索但没有成功 我正在跟进从这个系列 我已经从这里配置了 webpack dev serverlink https stackoverflow com questions
  • 动画不适用于 ::-webkit-slider-thumb

    我为 input type range 元素创建了一些自定义样式 我创建了以下动画 webkit keyframes balla from transform rotate 0 to transform rotate 360deg 我适用于
  • 通过nodejs、njs脚本语言扩展nginx

    我找到了您可以使用的 nginx 文档部分 ECMAScript 5 1 严格模式 以及一些 ECMAScript 6 和更高版本的扩展 扩展 nginx 作为用例 在请求到达上游服务器之前 njs 中进行复杂的访问控制和安全检查 http
  • 关于Java Cassandra Client,哪一个更好? CQL 怎么样? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试使用 Hive 作为数据库来开发应用程序 然后我还找到了 noSQL 解决方案作为它的替代方案 现在决定使用 Cassand
  • Notepad++改变文字颜色?

    我正在使用 Notepad 来模拟 ISPF 屏幕 我使用 StyleConfigurator 选择合适的字体 将其着色为绿色 并设置黑色背景 如何永久更改所选文本的颜色 例如 如果我的客户名称 THALECRESS 如何将客户名称 蓝色
  • 在 opentok ios sdk 中,呼叫者没有从接收者那里收到结束呼叫事件

    我有一个 iPhone 应用程序 我需要在其中管理从呼叫者到接收者的视频通话 并且它通过使用 Opentok 框架完美地工作 视频通话和音频一切正常 但我在从接收方结束呼叫而不接听电话时遇到问题 如果接收者接听电话然后结束通话 则呼叫者会收
  • 如何批量获取DynamoDB中的索引表?

    如何在DynamoDB中批量获取全局二级索引 这些参数给了我一个架构错误 因为这个哈希键仅在索引表中 主键有其他 const params RequestItems MyTableName Keys ThisHashKeyIsOnlyInI
  • ARM 汇编 SOS 中的 64 位除法

    我正在计算 16 个 64 位数字相加的平均值 我认为我已经正确完成了所有加法 但现在我需要弄清楚如何将 64 位数字除以 16 但我被困住了 任何帮助都会非常感谢你 到目前为止 这是我的代码 tableSize EQU 16 sum EQ
  • 破折号是 R 正则表达式中的特殊字符吗?

    尽管阅读了R 正则表达式的帮助页面 http stat ethz ch R manual R devel library base html regex html 最后 要包含文字 请将其放在第一个或最后一个 或者 对于 perl 仅 TR
  • AutoPostback 与 TextBox 失去焦点

    A TextBox被设定为AutoPostback因为更改值会导致重新计算和显示许多 仅显示 字段 效果很好 但是 当该字段被跳出时 焦点会短暂移动到下一个字段 然后在重新绘制页面时消失 因此任何地方都没有焦点 我希望焦点集中在新字段上 而
  • pandas 和 numpy 的平均值不同

    我有一个 MEMS IMU 我一直在其上收集数据 并使用 pandas 从中获取一些统计数据 每个周期收集 6 个 32 位浮点数 对于给定的收集运行 数据速率是固定的 数据速率在 100Hz 到 1000Hz 之间变化 收集时间长达 72
  • Android 精确闹钟总是关闭 3 分钟

    我有一个应用程序使用AlarmManager定期在整点唤醒手机并向 Android Wear 手表发送消息 然后手表会发出短暂的振动 我有两个用户 他们分别使用安装了 Android 5 1 1 的三星 Galaxy S6 和安装了 5 1
  • 锚定在桌子周围 - 无法在 Outlook 中工作

    我正在为 Mailchimp 开发一份时事通讯 其中一个块的 HTML 结构如下 table border 0 cellpadding 0 cellspacing 0 width 100 align center tr td valign
  • 是否可以获取所有实现接口的类? [复制]

    这个问题在这里已经有答案了 我可以通过反思或类似的方式来做到这一点吗 没有 100 可靠的方法可以做你想做的事 原因是 Java 中类加载的工作方式 Java 中的类是 按需 加载的 第一次在代码中引用类 无论是静态还是动态 时 JVM 将