使用 Java 代理将类添加到类路径

2024-04-12

我正在使用 Java Agent 和 Javassist 向某些 JDK 类添加一些日志记录。本质上,当系统加载一些 TLS 类时,Javassist 会向它们添加一些额外的字节码,以帮助我调试一些连接问题。

考虑到此类包含在代理 jar 中,问题如下:

package com.something.myagent;
public class MyAgentPrinter {
    public static final void sayHello() {
        System.out.println("Hello!");
    }
}

在我的代理的转换方法中,假设我尝试使用 javassist 调用该类:

// this is only called for sun.security.ssl.Handshaker
ClassPool cp = getClassPool(classfileBuffer, className);
CtClass cc = cp.get(className);
CtMethod declaredMethod = cc.getDeclaredMethod("calculateKeys");
declaredMethod.insertAfter("com.something.myagent.MyAgentPrinter.sayHello();");
cc.freeze();
return cc.toBytecode();

你认为这会起作用,但我得到的是:

java.lang.NoClassDefFoundError: com/something/myagent/MyAgentPrinter
    at sun.security.ssl.Handshaker.printLogLine(Handshaker.java)
    at sun.security.ssl.Handshaker.calculateKeys(Handshaker.java:1160)
    at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:292)

有什么方法可以添加该类[MyAgentPrinter] 到应用程序的类路径?


您的代理的 jar 文件已添加到类路径中,如指定的那样the java.lang.instrument包文档 https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html#package.description:

代理类将由系统类加载器加载(请参阅ClassLoader.getSystemClassLoader https://docs.oracle.com/javase/8/docs/api/java/lang/ClassLoader.html#getSystemClassLoader--)。这是类加载器,通常加载包含应用程序的类main方法。这premain方法将在与应用程序相同的安全性和类加载器规则下运行main method.

这就是为什么 Javassist 在转换字节码时可以找到 Agent 的类的原因。

问题似乎是你正在改变一个sun.**可能由引导加载程序或扩展加载程序加载的类。标准类加载委托是
application loader → extension loader → bootstrap loader,因此应用程序加载器可用的类不可用于扩展或引导加载器加载的类。

因此,为了使它们可供所有类使用,您必须将代理的类添加到引导加载程序:

public class MyAgent {
    public static void premain(String agentArgs, Instrumentation inst) throws IOException {
        JarURLConnection connection = (JarURLConnection)
            MyAgent.class.getResource("MyAgent.class").openConnection();
        inst.appendToBootstrapClassLoaderSearch(connection.getJarFile());

        // proceed
    }
}

在任何其他操作之前执行此操作至关重要,即在加载要供检测代码使用的类之前。这意味着 Agent 类本身,即包含premain方法无法被检测代码访问。 Agent 类也不应该直接引用MyAgentPrinter以避免意外的提前加载。

更可靠的方法是添加Boot-Class-PathAgent jar 清单的条目,请参阅包文档的“清单属性”部分 https://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html#navbar.bottom,以便在代理启动之前添加条目。但是,jar 文件的名称此后不得更改。

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

使用 Java 代理将类添加到类路径 的相关文章

  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐

  • 如何检查pdf页面是否有书签?

    我正在尝试检查 pdf 文件中的页面是否有书签以及该书签中的内容 我正在使用 iTextSharp text pdf 来阅读和操作 pdf 但我找不到方法检查页面是否有书签 请帮忙 谢谢 我尝试获取书签 但它获取了所有集合 但我不知道如何获
  • 监控Windows共享

    我正在尝试使用 C 监视与 Windows 共享的连接 我非常确定这是可能的 因为您可以从 Windows 控制台管理器看到连接到您的人员 虽然我不介意使用 WMI 的解决方案 但我更喜欢一些替代方法 我所说的连接是指有人在受监控的电脑上打
  • 如何使用纯 javascript 获取 DIV 内的所有 id

    我想立即获取 Div 内每个元素的每个 ID 并更改它们的所有类名 喜欢 div div div div div div div div div div 我见过使用库的解决方案 但这可以用纯 Javascript 实现吗
  • 在ASP.NET中的子控件中创建ASP.NET ReportViewer;文档结构图按钮中断

    我们在使用 Visual Studio 2008 ReportViewer 控件时遇到了一个奇怪的问题 具体来说 当我们在页面上有一个子控件 并且子控件本身承载一个报表查看器 并且该报表具有文档结构图时 显示 隐藏文档结构图按钮上的回发似乎
  • 如何使用 jQuery 将 div css 的可见性更改为可见

    我的屏幕上有 下一个 和 上一个 按钮 当页面最初加载时 我希望隐藏 上一个 按钮 并且一旦用户单击 下一个 按钮 我希望 上一个 按钮 div 标签可见 我有一个用于 上一个 按钮的 CSS 属性 我将其可见性值设置为 False 还有一
  • .htaccess mod 重写规则和与号

    我已经为此苦苦挣扎了两天 目前我有以下重写规则 RewriteRule index php u 1 NC L 它将 example com 后面的所有内容作为 GET 变量 u 移植到 index php 它正在index php中进行处理
  • XOR 加密有什么问题?

    我编写了一个简短的 C 程序来对文件进行 XOR 加密 我可以将其用于一些个人文件 如果它被破解 那没什么大不了的 我只是防止临时查看者 基本上 我采用 ASCII 密码并重复将密码与文件中的数据进行异或 但现在我很好奇 如果有人想破解这个
  • Spring Boot - 无法启动嵌入式 tomcat 错误

    pom xml
  • 类似于 std::integral_constant 但在 std C++20 库中具有自动模板参数?

    从C 20开始可以使用auto实现积分常量的模板参数 在线尝试一下 https godbolt org z 3dfq7bbP1 template
  • 使用 StackLayout 进行标签换行

    我正在使用 Xamarin 并使用 XAML 创建视图 但我一生都无法让这个标签按照我想要的方式包装 如果标签到达屏幕边缘 我希望它像这样换行 现在它看起来像这样 这是我的代码
  • 使用 Python 导出 Tensorflow 网络并在不使用 Bazel 的情况下使用 C++ 导入

    使用 TensorFlow 我尝试在 C 文件中加载我在 Python 中训练的网络 我正在保存带有输入张量的网络x和输出张量y在 Python 上 with tf Session graph tf Graph as sess tf sav
  • facebook opengraph 中的推断属性是什么意思 [重复]

    这个问题在这里已经有答案了 可能的重复 在对象调试器中得到错误的 ogtype https stackoverflow com questions 9953779 get wrong ogtype in object debugger 我有
  • 从角度服务通过管道传输时,rxjs catchError 不起作用

    使用 redux 和 Angular 我有以下效果 Effect public authenticate Observable
  • 如何分割字节数组

    我在内存中有一个字节数组 从文件中读取 我想在某个点 索引 分割字节数组 而不必只创建一个新的字节数组并一次复制每个字节 从而增加操作的内存占用 我想要的是这样的 byte largeBytes 1 2 3 4 5 6 7 8 9 byte
  • 如何使用DialogFragment和FragmentManager制作DatePicker?

    所以我已经在这个问题上有一段时间了 但我似乎无法弄清楚 我对 Android 开发还很陌生 所以请耐心等待 我对创建日期选择器不太熟悉 我学会了以不推荐使用的方式来完成它 只是为了掌握它的窍门 使用本教程来帮助我加快速度 http deve
  • 使用 CLI 时如何将 Java 类添加到 Worklight 适配器

    我正在尝试将 Java 类添加到我的适配器 如教程中所述在适配器中使用 Java http public dhe ibm com software mobile solutions worklight docs v620 04 12 Usi
  • 当鼠标悬停在放置目标上时如何更改拖放光标

    我有一个应用程序 其中包含一个取消归档 文件属性 文件的放置目标 我想将表单的 DragEnter 事件中的鼠标光标更改为我作为嵌入资源的自定义光标 cur 放置目标是带有目标图像的透明形式 整个表格是放置目标 我知道当我控制拖动源时可以使
  • 通过 AJAX 将动态字段添加到嵌套表单

    我一直在我的应用程序上观看和重现这些轨道广播 196 嵌套模型表单第 1 部分 http railscasts com episodes 196 nested model form part 1 and 197 嵌套模型形式 第 2 部分
  • 如何在 R 中堆叠数据框[重复]

    这个问题在这里已经有答案了 我有一个数据框 我想将其堆叠在 R 中 这样我最终会得到三列 下面是当前格式的一些示例数据 gt dput df structure list Day c d1 d2 d3 d4 d5 d6 d7 d8 d9 d
  • 使用 Java 代理将类添加到类路径

    我正在使用 Java Agent 和 Javassist 向某些 JDK 类添加一些日志记录 本质上 当系统加载一些 TLS 类时 Javassist 会向它们添加一些额外的字节码 以帮助我调试一些连接问题 考虑到此类包含在代理 jar 中