gpt4 book ai didi

java - 如何在java中重新定义lambda匿名类

转载 作者:行者123 更新时间:2023-12-02 06:26:04 25 4
gpt4 key购买 nike

JDK8将lambda表达式转换为匿名类

InnerClassLambdaMetafactory.spinInnerClass() {
return UNSAFE.defineAnonymousClass(targetClass, classBytes, null);
}

我正在编写一个javaagent,使用asm修改classBytes(添加一个方法)并将其传递给defineAnonymousClass,但该方法最终会出现ClassNotFoundException匿名类。有什么方法可以修改匿名 classBytes 的内容吗?

最佳答案

转换匿名加载的类是很棘手的。您是否正在重新转换代表此类的已加载类?如果是这样,请注意 Class::getName 不会返回类的实际二进制名称,而是在您需要的位置添加随机哈希,例如 my.DefinedType/12345删除最新的数字。

此外,您不能直接从另一个类引用此类,但您需要直接从反射 API 或理想情况下从方法句柄引用它们。您无法从类加载器中查找此类类,这就是它们被称为匿名类的原因。

最后,在安装类文件转换器时,此类匿名类的加载不会注册到转换器中。处理此类的最简单方法是修补负责创建 lambda 类型的 lambda 元工厂。您可以通过使用例如 Byte Buddy 轻松做到这一点它允许您创建代理:

new AgentBuilder.Default()
.with(LambdaTransformationStrategy.ENABLED)
.type(someMatcher)
.transform(someTransformer)
.installOn(instrumentation);

在幕后调用此方法,Byte Buddy 重写了 JVM 的默认 lambda 元工厂类,并将其替换为自己的代码生成(其中可以进行此类检测)。

关于java - 如何在java中重新定义lambda匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40252950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com