首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Bytebuddy -截取java.lang.RuntimeException构造函数

Bytebuddy -截取java.lang.RuntimeException构造函数
EN

Stack Overflow用户
提问于 2020-04-17 11:24:04
回答 1查看 114关注 0票数 0

我正在尝试截取构造函数RuntimeException(String)。我正在尝试使用前面提到的here和显示的here中的Advice。而是onEnter(String message)onExit(String message)方法。我的检测类(在不同的jar中):

代码语言:javascript
运行
AI代码解释
复制
public class Instrumenting {

private static final String CLASS_NAME = "java.lang.RuntimeException";

public static void instrument(Instrumentation instrumentation) throws Exception {
    System.out.println("[Instrumenting] starting to instrument '" + CLASS_NAME + "'");

    instrumentation.appendToBootstrapClassLoaderSearch(new JarFile("C:\\Users\\Moritz\\Instrumenting\\dist\\Instrumenting.jar"));

    File temp = Files.createTempDirectory("tmp").toFile();
    ClassInjector.UsingInstrumentation.of(temp, ClassInjector.UsingInstrumentation.Target.BOOTSTRAP, instrumentation).inject(Collections.singletonMap(
        new TypeDescription.ForLoadedType(RuntimeExceptionIntercept.class),
        ClassFileLocator.ForClassLoader.read(RuntimeExceptionIntercept.class)));


    new AgentBuilder.Default()
            .ignore(ElementMatchers.none())
            .with(new AgentBuilder.InjectionStrategy.UsingInstrumentation(instrumentation, temp))
            .type(ElementMatchers.named(CLASS_NAME))

            .transform((DynamicType.Builder<?> builder, TypeDescription td, ClassLoader cl, JavaModule jm) -> 
                    builder
                            .visit(Advice.to(RuntimeExceptionIntercept.class)
                                            .on(ElementMatchers.isConstructor())
                            )
            ).installOn(instrumentation);

    System.out.println("[Instrumenting] done");
}

public static class RuntimeExceptionIntercept {

    @Advice.OnMethodEnter
    public static void onEnter(String message) throws Exception {
        System.err.println("onEnter: " + message);
    }

    @Advice.OnMethodExit
    public static void onExit(String message) throws Exception {
        System.err.println("onExit: " + message);
    }
}

}

它的名字是:

代码语言:javascript
运行
AI代码解释
复制
public class Main {

public static void premain(String agentArgs, Instrumentation instrumentation) throws Exception {
    Instrumenting.instrument(instrumentation);
}

public static void main(String[] args) throws MalformedURLException, IOException {
    new RuntimeException("message");
}

}

输出:

代码语言:javascript
运行
AI代码解释
复制
[Instrumenting] starting to instrument 'java.lang.RuntimeException'
[Instrumenting] done

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-04-17 19:14:54

当您的代理运行时,该类已经加载,而您没有指定例如RedefinitionStrategy.RETRANSFORM。因此,您的代理不会重新考虑已经装入的类。请注意,您应该设置一个比此更具体的忽略匹配器。

顺便说一下,通知是内联在目标类中的,不需要您的注入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61270453

复制
相关文章
C++构造函数 | 构造函数
C++在建立一个对象时,常常需要作某些初始化,如果一个数据成员未被赋值,则它的值是不可预知的,因为在系统为它分配内存时,保留了这些存储单元的原状,这就成为了这些数据成员的初始值,在C++中,对象是一个实体,它反映了客观事物的属性,是应该有确定的值的。
小林C语言
2021/01/26
2.3K0
C++构造函数 | 构造函数
excel截取字符串函数_截取函数 excel
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/01
1.3K0
【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
1 . 构造函数个数 : Kotlin 类定义时需要指定主构造函数 , 还可以指定 0 ~ 多个次构造函数 ;
韩曙亮
2023/03/27
4.4K0
【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )
如果 C++ 类中 没有定义构造函数 , C++ 编译器会自动为该类提供一个 " 默认的无参构造函数 " , 函数体为空 , 不做任何操作 ;
韩曙亮
2023/10/15
1.5K0
【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )
js 中的构造函数,构造函数作用,构造函数和普通函数的区别
函数的定义方式: 1.声明式函数定义: function 函数名 (){};这种定义方式,会将函数声明提升到该函数所在作用域的最开头,也是就无论你在这个函数的最小作用域的那儿使用这种方式声明的函数,在这个作用域内,你都可以调用这个函数为你所用。 2.函数表达式:let fun = function(){}; 此方式定义的函数,只能在该作用域中,这段赋值代码执行之后才能通过fun()调用函数,否则,由于变量声明提升,fun === undefined。 3.new Function 形式: var fun1 = new Function (arg1 , arg2 ,arg3 ,…, argN , body );Function构造函数所有的参数都是字符串类型。除了最后一个参数, 其余的参数都作为生成函数的参数即形参。这里可以没有参数。最后一个参数, 表示的是要创建函数的函数体。
全栈程序员站长
2022/10/04
3.7K0
【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )
无参构造函数 : 只负责为指针类型的成员变量分配内存 , 并赋值一个初始值 , 没有具体的赋值信息 , 该初始化只能为 成员变量 赋值一个默认值 ;
韩曙亮
2023/10/15
5690
【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 )
np.clip截取函数
将范围外的数强制转化为范围内的数 def clip(a, a_min, a_max, out=None): 将数组a中的所有数限定到范围a_min和a_max中,即az中所有比a_min小的数都会强制变为a_min,a中所有比a_max大的数都会强制变为a_max. 其中a_min和a_max可以为一个和a一样大小的数组(列表也可以,只要是类似数组的结构就是可行的),则数组中相应位置的元素进行比较。 out 是可选项,表示把强制截取后的结果放到这个数组中,但是out中的数组必须和a形状一样 Example
演化计算与人工智能
2020/08/14
7220
何为构造函数
Java构造函数,也叫构造方法,是Java中一种特殊的函数。函数名与对应类名相同,无返回值。
JanYork_简昀
2022/03/29
8270
何为构造函数
Javascript构造函数
     构造函数注意事项: 1.默认函数首字母大写 2.构造函数并没有显示返回任何东西。new 操作符会自动创建给定的类型并返回他们,当调用构造函数时,new会自动创建this对象,且类型就是构造函数类型。 3.也可以在构造函数中显示调用return.如果返回的值是一个对象,它会代替新创建的对象实例返回。如果返回的值是一个原始类型,它会被忽略,新创建的实例会被返回。 function Person( name){                 this.name =name;            
hbbliyong
2018/03/06
1.5K0
Javascript构造函数
javascript构造函数
我们昨天前几天讨论过构造函数constructor,得出了结论 constructor是原型对象上的一个属性,默认指向这个原型的构造函数 这个结论貌似对我们平时的工作中似乎并没有什么用处,那构造函数,就真的没什么用处吗?
陌上寒
2019/04/02
1.1K0
javascript构造函数
[ Java学习基础 ] Java构造函数
   构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用。 Java构造方法的特点如下: 构造方法名必须与类名相同。 构造方法没有任何返回值,包括void。 构造方法只能与new运算符结合使用。 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int wi
Kevin_Zhang
2018/05/22
1.3K0
java构造函数方法声明无效_如何构造函数
Java构造函数,也叫构造方法,是JAVA中一种特殊的函数。与函数名相同,无返回值。
全栈程序员站长
2022/10/05
1.7K0
复制构造函数
生成一个对象的副本有两种途径——第一种途径是建立一个新的对象,然后将一个已有对象的数据成员值取出来,赋值给新的对象。这样做虽然可行 但是实在是太麻烦了。而接下来,向大家介绍 复制构造函数 ——它的作用就是用一个已有的对象,来执行一个新的对象的构造。
小飞侠xp
2022/03/23
8890
工厂函数和构造函数
工厂模式是一种设计模式,说白了就是一种简单的函数,这个函数可以创建对象,为它添加属性和方法,然后返回这个对象。就像一个工厂一样,可以批量制作某种类型的对象。这种设计模式是就是为了降低代码冗余。
大熊G
2022/11/14
7710
[Kotlin] 构造函数总结
主构造函数 // Kotlin 的构造函数可以写在类头中,跟在类名后面。 // 这种写法声明的构造函数,我们称之为主构造函数。 class Person(private val name: String) { fun sayHello() { // 主构造函数中声明的参数,它们默认属于类的公有字段。 println("hello $name") } } // 与上面的作用一致:声明主构造函数 class Person constructor(private v
用户3702315
2021/03/30
1.1K0
java构造函数调用另一个构造函数_java中的构造函数
* 构造方法是专门用来创建对象的方法,当我们通过关键字new来创建对象时,其实就是在调用构造方法
用户7886150
2021/04/29
4.8K0
【Kotlin】类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )
在 Kotlin 类中 , 可以在 类声明 时 在 类名后 定义 " 主构造函数 " ;
韩曙亮
2023/03/30
5.1K0
C++构造函数语义(合成默认构造函数)
       在初学C++的时候,对于一个对象来说,如果我们没有去定义其默认构造函数,那么编译器就会为我们自动生成一个默认构造函数。但其实是不准确的,具体来说是编译器会在必要的时候来生成一个默认构造函数,那么这个编译器生成的默认构造函数称为合成默认构造函数。那么在以下四种情况中编译器才会生成一个合成默认构造函数:
Ch_Zaqdt
2020/03/09
1.4K0
构造函数隐式转换_构造函数实例化对象
http://blog.csdn.net/thefutureisour/article/details/7705771
全栈程序员站长
2022/11/10
4330
创造特殊的构造函数——寄生构造函数模式
当我们需要构造一个特殊的数据,我们可以通过寄生构造函数来实现。比如我们要格式化一个Array(简单举例),将其变成一个有“|”组成的字符串,我们可以这么做:
就只是小茗
2018/12/07
9970

相似问题

Bytebuddy -截取java.net.ServerSocket构造函数

142

在ByteBuddy中的rebase期间截取构造函数

119

ByteBuddy子类构造函数

11

ByteBuddy拦截构造函数参数

120

ByteBuddy使用构造函数创建枚举

123
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档