我应该向 Proxy.newProxyInstance(...) 提供哪个类加载器?

2023-12-28

我已阅读文档,但我仍然不明白应该提供哪个类加载器作为参数。我尝试了一些选项,但这似乎对编译或代理的行为没有影响。有点令人不安的是,我可以传递任何内容作为类加载器参数,包括null,并且代码仍然可以正常工作。谁能解释一下这一点,并告诉我如果我为类加载器提供错误的参数,会出现什么样的错误?我应该补充一点,对于 Java 中或一般情况下的类加载器是什么,我并没有非常直观的想法。


任何类都需要有一个类加载器,因此我们必须在这里给出一个。

重要的部分是这个(在的文档getProxyClass() http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Proxy.html#getProxyClass%28java.lang.ClassLoader,%20java.lang.Class...%29):

所有接口类型必须通过指定的类加载器按名称可见。换句话说, 对于类加载器 cl 和每个接口 i,以下表达式必须为真:

Class.forName(i.getName(), false, cl) == i

因此,您可以使用任何类加载器,其中一个(或多个)父类加载器定义了给定的接口。

If null适用于你的情况,我想你的界面也有null类加载器(引导加载器) - 那么您使用哪个类加载器并不重要。如果您必须从您不知道的接口创建代理,只需获取给定的第一个接口的类加载器,并希望您的调用者没有做一些奇怪的事情。

为什么需要它?

你可以这样想象:

  • The getProxyClass()方法为一个新类创建(如果尚不存在)一些字节码,该新类实现所有接口的所有方法(每个方法只是将调用转发到您的InvocationHandler).
  • 然后它将这个字节码传递给defineClass您指定的类加载器的方法。
  • 在此字节码中,所有接口均按名称引用,并且虚拟机现在使用引用的接口forName调用来解析这些接口。

我们本来可以实现这个getProxyClass这种方式在纯 Java 中没有任何 VM 魔法,但我们需要为其创建一个新的类加载器(以指定的类加载器作为父类),而不是能够重用现有的类加载器。

实际上,这个合成类可能没有实际的字节码,因为虚拟机能够在这里使用其内部魔法:-)

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

我应该向 Proxy.newProxyInstance(...) 提供哪个类加载器? 的相关文章

随机推荐

  • Python Dask:无法将非有限值(NA 或 inf)转换为整数

    我正在尝试从 postregres 表中捕获一个非常大的结构化表 它大约有 200 000 000 条记录 我在用dask而不是 pandas 因为它更快 当我将数据加载到df它比 pandas 快得多 我正在尝试使用将 dask Data
  • Elasticsearch:组合功能分数

    我对 es 查询的评分为三functions query function score query bool score mode multiply boost mode replace functions f1 f2 f3 所以分数是 f
  • 具有特定 Order By 格式的 SQL 查询 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含以下值的表 OperationCode OperationDesc OperationOrder Repl Remove 1
  • 哪些 .Net Orms 或 MicroOrms 支持异步操作和 PostgreSql

    哪些 ORM 支持异步操作和 postgresql 我更喜欢简单的 MicroOrms 例如 Dapper 和 OrmLite 因为它们似乎具有出色的性能并且非常简单 但据我所知 它们不支持异步操作 也许我错了 但是让所有 IO 绑定操作异
  • 使用 mongoDB 聚合按文本搜索

    我正在尝试对名为的集合进行文本搜索DAFacility在 MongoDB 指南针中 id 62170597b3fa8994a0d9a0c8 author User organizationName TSTT eventName Facili
  • 表达式和变量的 C++ 类型和值类别

    由此link http en cppreference com w cpp language type 它说 对象 引用 函数 包括函数模板特化 和表达式都具有称为类型的属性 因此考虑到以下情况 int rf int 10 我可以说这个变量
  • Django的manage.py显示旧命令

    我正在编写自己的 whl 包 在创建了一些新的管理命令并删除了一些旧的命令后 我对自己非常满意 除了在构建我的轮子包之后 与setup py bdist wheel 并将其安装在我的测试服务器上 使用pip install U projec
  • 更改 Drupal 的主题并保留 Garland 作为管理主题?

    如何在不更改管理主题 站点的 contrib 主题和管理界面的 Garland 的情况下将 contrib 主题应用到 Drupal 6 站点 Thanks 转到管理 gt 站点配置 gt 管理主题 在那里 您可以设置管理主题 如果您想对管
  • 使用 inno setup 卸载默认图标

    我正在使用 Inno setup 将卸载图标添加到 开始 菜单文件夹 using the Inno Setup Script Wizard example My program there is a default uninstall ic
  • 无论锁定状态如何写入锁定文件

    有没有办法写入锁定的文件 无论它打开哪个程序 进程 设想 作为服务运行的商业产品会锁定日志文件 服务不能停止 因为这会影响客户 想在文件末尾插入一行作为标记 出现错误 该进程无法访问该文件 因为该文件正在被另一个进程使用 有什么方法可以在锁
  • 如何从 C 文件中获取完整的汇编代码?

    我目前正在尝试找出从相应的 C 源文件生成等效汇编代码的方法 我使用 C 语言已经好几年了 但对汇编语言的经验很少 我能够使用以下命令输出汇编代码 S海湾合作委员会中的选项 然而 生成的汇编代码包含调用指令 这些指令又跳转到另一个函数 例如
  • ActiveRecord find_each 结合 limit 和 order

    我正在尝试使用 ActiveRecord 运行大约 50 000 条记录的查询find each方法 但它似乎忽略了我的其他参数 如下所示 Thing active order created at DESC limit 50000 fin
  • 什么时候在函数外部返回值使用移动与复制?

    读完这篇文章后question https stackoverflow com questions 11914691 copy elision move constructor not called when using ternary e
  • Facebook Open Graph API - og:元标签被忽略

    我正在解决页面标题和图像未包含在 Facebook 点赞中的问题 使用 OG 调试器后 看起来没有og Facebook 正在访问元标签 它说它正在推断og url and og title页面上存在的属性 作为测试 我直接从开发人员文档的
  • 类型错误:无法读取未定义的“想要”属性:

    我一整天都在使用 firebase 成功部署功能 学习如何使用它 我试图看看如果我初始化了另一个部署到同一个项目的目录并且没有任何问题 直到我更新了我的 npm 版本 现在每当我尝试部署时都会收到 发生意外错误 我尝试通过让我自己的用户成为
  • 如何在Listview的OnClickListener中获取被点击项目的位置?

    我想在列表视图上获取选定的列表视图项目 onclick 侦听器 现在我已经实施了onItemClickListener但是当我单击某个项目文本时 它就会被提升 我想在列表视图行单击时引发它 知道如何实现这一目标吗 要获取列表 onClick
  • C# 从 IP 地址字符串中删除尾随“\0”

    我通过 TCP 套接字收到了一个字符串 这个字符串看起来像这样 str 10 100 200 200 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 我应该如何将其解析为 IP 地址 如果我这样做 IPAddress TryPa
  • Spring Cloud Stream 和 RabbitMQ 健康检查

    我有一个使用 Spring Cloud Stream Rabbit 和 Eureka Discovery Client 的简单 Spring Boot 应用程序 该应用程序与 Eureka Server 一起工作正常 并且通过 Rabbit
  • 当 WKExtension.scheduleBackgroundRefresh 应该调用 ScheduledCompletion 处理程序时?

    我正在尝试用这样的行安排后台任务 WKExtension shared scheduleBackgroundRefresh withPreferredDate Date timeIntervalSinceNow TimeInterval 5
  • 我应该向 Proxy.newProxyInstance(...) 提供哪个类加载器?

    我已阅读文档 但我仍然不明白应该提供哪个类加载器作为参数 我尝试了一些选项 但这似乎对编译或代理的行为没有影响 有点令人不安的是 我可以传递任何内容作为类加载器参数 包括null 并且代码仍然可以正常工作 谁能解释一下这一点 并告诉我如果我