`
sswh
  • 浏览: 163871 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

BTrace二三事之一:类转换方式和子类的匹配

    博客分类:
  • java
阅读更多
以下基于BTrace1.2.2
[url]http://kenai.com/projects/btrace/downloads/directory/releases
[/url]

BTrace类的增强分两部分:

Agent载入之前已加载类的转换;
Agent载入之后新定义类的转换;

其中,Agent载入之前已加载类的转换在:
com.sun.btrace.agent.Main.handleNewClient(final Client client)方法中处理;

关键的处理步骤:

// 注册类转换器---即:ClassFileTransformer
client.registerTransformer();

// 获取所有已加载的类
Class[] classes = inst.getAllLoadedClasses();

// 对所有已加载的类进行过滤,挑选出BTrace脚本需要跟踪的类,
// 对于“+”标识的类,通过递归superClass和superInterfaces查找
if(client.isCandidate(c))list.add(c);

// 重转换已加载的需要跟踪的类---会导致之前注册的类转换器被调用,从而实现类的增强
inst.retransformClasses(classes);


~~~~~~~~~~~~~~
Agent载入之后新定义类的转换机制:

新定义的类的转换,当类被加载时,会自动触发ClassFileTransformer,从而实现类的转换。

这儿的难点是:如何实现“+”:即子类的查找匹配;
@OnMethod(clazz = "+my.Command", method = "execute")

原因是:我们知道ClassFileTransformer被触发的时机包括3种:

类定义之时:ClassLoader.defineClass();
类重定义之时:Instrumentation.redefineClasses()
类重转换之时:Instrumentation.retransformClasses(),Agent载入之前已加载类的转换就是通过这种方式实现的

而ClassLoader.defineClass()之时和后面两种时机最主要的差别是Class是否已经加载;
public byte[] transform(ClassLoader loader, final String cname, 
    Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer);
即:transform方法中classBeingRedefined是否为null

我们也知道类的字节码byte[] classfileBuffer中仅仅包含直接superClass和实现接口的字符串,
而不包含间接超类和间接接口,所以仅仅凭借字节码是无从进行“+”子类的匹配判断的。
这些superClass和接口的字符串必须连接后变成真正的Class对象,才能通过递归的方式匹配查找。

为了实现“+”的查找,BTrace额外提供了一个ClassFileTransformer,这个被称作clInitTransformer,
它的作用是对所有需要加载的类,在类的静态初始化部分增加下面的代码:
{
  BTraceRuntime.retransform(Ljava/lang/String;Ljava/lang/Class;)
}

以达到类被初始化后,立即发生重转换;从而再次触发ClassFileTransformer的目的。

这就是BTrace中存在两个ClassFileTransformer的原因:
void registerTransformer() {
    inst.addTransformer(clInitTransformer, false);
    inst.addTransformer(this, true);
}

也是hasSubclassChecks变量存在的原因。---如果有“+”存在,就强制类的重转换。
分享到:
评论

相关推荐

    BTrace二三事之二:OnMethod子类匹配BUG(怀疑)

    本文将深入探讨“BTrace二三事之二:OnMethod子类匹配BUG(怀疑)”这一主题,结合源码分析和实际工具应用,揭示可能存在的问题及其解决策略。 首先,我们要理解BTrace的工作原理。BTrace是基于字节码注入的技术,它...

    Java语言程序设计:JAVA_5-子类与继承.ppt

    Java语言的继承机制是面向对象编程的一个核心特性,它允许我们创建新的类(子类)时基于现有的类(父类)。这种机制使得代码重用变得简单,同时也支持多态性,增强了程序的灵活性和可扩展性。 在Java中,通过使用`...

    设计一个学生类Student和它的一个子类Undergraduate,要求如下

    设计一个学生类Student和它的一个子类Undergraduate,要求如下: 1) Student类有name(姓名)、和age(年龄)属性,一个包含两个参数的构造方法,用于给name和age属性赋值,一个show()方法打印Student的属性信息 2) ...

    USB设备类及设备子类及接口采用的设备类协议.pdf

    子类是第二个字节,它提供基础类的进一步划分和细化;协议是第三个字节,用于标识子类的具体通信协议。在USB设备中,类代码信息可以放置在两个位置:设备描述符和接口描述符。设备描述符描述了整个USB设备的通用属性...

    C#子类舍弃属性转换为父类UtilSubToBase.cs

    利用C#反射将子类舍弃多余的属性转换为父类,用途比较少。

    Person类和它的两个子类Student、Employee

    在这个问题中,我们讨论了一个基本的类层次结构,其中`Person`类是顶级抽象类,而`Student`和`Employee`是其直接子类。进一步,`Employee`类有两个更具体的子类,即`Faculty`(教员)和`Staff`(职员)。这种设计...

    一个MyGraphic类以及子类

    实现一个图形类以及子类,其可以描述基本图形的属性及必要方法。

    java 子类对象赋值给父类对象的使用

    在Java编程语言中,子类继承父类是一种常见的特性,它允许子类扩展或复用父类的功能。当我们创建一个子类对象并将其赋值给父类引用时,这种行为被称为向上转型(Upcasting)。这一过程是自动且安全的,因为子类对象...

    以员工为编写一个程序,定义如下类:以员工为父类,该类包含员工的基本信息:姓名、年龄、部门。创建两个子类:经理类和工人类,输出经理和工人的工资。在父类中编写getSalary()方法,在子类中覆盖,实现多态。

    本案例中,我们构建了一个基本的员工类作为基类,并从它派生出两个子类:经理类和工人类。通过这些类的设计,我们可以实现对不同类型的员工进行基本信息的管理,并且能够根据不同类型的员工计算他们的工资。 ### ...

    C++操作符重载的变态用途之子类转换

    3. **维护成本增加**:对于未来维护代码的开发者来说,理解这类转换背后的逻辑将会是一项挑战,从而增加了维护的成本。 #### 总结 尽管C++中的操作符重载提供了强大的灵活性,但应谨慎使用,尤其是在涉及子类转换...

    设计模式之里氏转换原则

    里氏转换原则(Liskov Substitution Principle,简称LSP)是面向对象设计的基本原则之一,它是SOLID原则中的L原则。这个原则是由Barbara Liskov在1987年提出的,它规定子类型必须能够替换它们的基类型,而不影响程序...

    父类赋值给子类

    在 C# 中,父类(也称为基类或超类)是定义了一组属性和方法的类,而子类(也称为派生类)是从父类继承并可能添加更多特性的类。通过继承,子类可以重用父类的代码,同时扩展其功能。 当需要将父类的对象赋值给子类...

    Java入门 类与子类

    本代码用类和子类实现了输出复数的功能。适合初学者参考学习

    Hibernate继承映射二:每个子类一张表

    这种方式也被称为单表继承或多表继承,是Hibernate支持的四种继承映射策略之一。了解并熟练掌握这种映射模式对于提升Java开发效率和代码维护性至关重要。 在传统的面向对象编程中,类可以有继承关系,但在关系...

    演示如何通过子类化创建自己的窗口类

    在Windows操作系统中,每个窗口都有一个与之关联的窗口类,它定义了窗口的基本属性,如窗口样式、消息处理函数等。当我们创建一个新的窗口时,通常会基于已有的窗口类,如WC_BUTTON(按钮)、WC_EDIT(编辑框)等,...

    在父类获取子类属性

    在Java编程语言中,"在父类获取子类属性"是一个常见的需求,特别是在设计模式、继承和多态性等核心概念的应用中。这个主题涉及到面向对象编程的基本原理,特别是子类继承父类后如何访问和操作子类特有的属性。下面...

Global site tag (gtag.js) - Google Analytics