首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入理解Instrument(一)

Agent),也就是专门java语言编写插桩服务提供支持代理。...long getObjectSize(Object objectToSize):获取某个对象(字节)大小,注意嵌套对象或者对象中属性引用需要另外单独计算。...如何使用Instrumentation Instrumentation类在API注释中有十分简洁使用方式描述: 有两种方式可以获取Instrumentation接口实例: JVM在指定代理方式下启动...Instrumentation局限性 大多数情况下,我们使用Instrumentation都是使用字节码插桩功能,或者笼统说就是类重定义(Class Redefine)功能,但是有以下局限性:...新类和老类实现接口数也要相同,并且是相同接口。 新类和老类访问符必须一致。 新类和老类字段数和字段名要一致。 新类和老类新增或删除方法必须是private static/final修饰

2.8K30

博文精译|使用代理(Agent)Java Bytecode Instrumentation:在运行时侵入Java应用程序(1)

在实际开发中,大部分硬编码应作为可配置参数; 在一个独立程序和补充开发类,当调用相应对象及查看状态时,控制台输出被大量使用,以使信息充分方便地展示。...字节码instrumentation和操作 JDK从Java 5开始开发人员提供所谓字节码instrumentation功能。...这种技术目标是修改加载到JVM并由执行字节码——例如,扩展附加指令或对原始字节码其他更改。需要注意是,字节码instrumentation不会对字节码原始资源(类文件)造成任何更改。...在调用System.output.println()之前,我们将另一个赋值注入到使用变量中,这样控制台输出就与从程序主类传递不同; 也可以通过引入所谓表达式编辑器实现类改变已经存在字节码...,它可以拦截和取代构造函数和方法调用,访问类字段,异常处理,等。

65820
您找到你想要的搜索结果了吗?
是的
没有找到

Java字节码增强探秘

首先一个字节“tag”,它取自上图6中对应项Tag,由于它类型是utf8_info,所以“01”。接下来两个字节标识该字符串长度Length,然后Length个字节这个字符串具体。...从图2中字节码摘取一个cp_info结构,如下图7右侧所示。将它翻译过来后,含义:该常量类型utf8字符串,长度一字节,数据“a”。 ?...紧接着n个字节是所有接口名称字符串常量索引。 (8) 字段字段表用于描述类和接口中声明变量,包含类级别的变量以及实例变量,但是不包含方法内部声明局部变量。...字段表也分为两部分,第一部分为两个字节,描述字段个数;第二部分是每个字段详细信息fields_info。字段表结构如下图所示: ? 图10 字段表结构 以图2中字节码字段例,如下图11所示。..."end",即将字符串“end”压入栈。

1K20

Java字节码增强探秘

首先一个字节“tag”,它取自上图6中对应项Tag,由于它类型是utf8_info,所以“01”。接下来两个字节标识该字符串长度Length,然后Length个字节这个字符串具体。...从图2中字节码摘取一个cp_info结构,如下图7右侧所示。将它翻译过来后,含义:该常量类型utf8字符串,长度一字节,数据“a”。 ?...紧接着n个字节是所有接口名称字符串常量索引。 (8) 字段字段表用于描述类和接口中声明变量,包含类级别的变量以及实例变量,但是不包含方法内部声明局部变量。...字段表也分为两部分,第一部分为两个字节,描述字段个数;第二部分是每个字段详细信息fields_info。字段表结构如下图所示: ? 图10 字段表结构 以图2中字节码字段例,如下图11所示。..."end",即将字符串“end”压入栈。

1.8K51

NHibernate介绍「建议收藏」

要注意是所有需要持久化属性必须是虚拟,并且要开启延迟加载,所有数据模型类中公共方法必须是虚拟,哪怕它们并没有包含到映射文件中。 通常来讲,最好把所有的属性设置虚拟。...> 在hibernate-maping标签中,同时引用类集(POCOs)所属程序集命名空间。...id元素告诉NHibernate哪个数据库字段和对应对象作为一个唯一键来使用。在本例中,我们使用Id这个字段。 generator元素告诉NHibernate怎样给新实体来创建唯一ID。...property标签是见得最多标签。它简单地映射一个到数据表或者视图中对应字段映射。...一旦XML文件创建好了,需要更改XML生成方式确保它被设置嵌入式资源,否则NHibernate不会读取这个XML文件,那么映射就不会生效了。

63120

【Kotlin】类初始化 ① ( 成员属性 | Kotlin 自动成员字段生成 getter 和 setter 方法 | 手动设置成员 getter 和 setter 方法 | 计算属性 )

文章目录 一、Kotlin 自动成员字段生成 getter 和 setter 方法 二、手动设置成员 getter 和 setter 方法 三、计算属性 一、Kotlin 自动成员字段生成 getter...反编译后 结果 如下 : 二、手动设置成员 getter 和 setter 方法 ---- Kotlin 会为 类中每个 成员属性 生成一个 field , getter , setter ;...---- 如果 Kotlin 类中 某个属性 是 通过计算得到 , 可以 在该属性 getter 和 setter 方法中进行计算设置获取结果 , 不使用 field 属性 ; 下面的 age...属性就是通过计算得到属性 , 每次获取都是 0 ~ 100 之间随机 , 没有使用到 field ; val age get() = Math.random() * 100...// 每次获取都是 0 ~ 100 之间随机 代码示例 : class Hello { val age get() = Math.random() * 100 // 每次获取都是

1.5K20

使用代理(Agent)Java Bytecode Instrumentation:在运行时侵入Java应用程序(2)

这是通过使用附加JVM参数“-javaagent”来实现,并将代理JAR文件位置指定为该参数(如果代理接受任何参数或选项,它们也可以作为参数值一部分传递):-javaagent:jarpath...对运行中JVM连接可以通过其中运行Java应用程序触发,但它也可以由外部JVM进程发起—这我们提供了一种可能,我们可以开发一个外部应用程序附加到正在运行JVM进程,给它加载一个代理(当然,相应安全问题必须考虑...”这样JVM属性。...为了更好地了解哪些类已经加载,可以用JVM参数" - verbose:class "来启用类加载日志,然后从日志检查,判断一个instrumented类在代理加载之前是否已经加载到JVM,谁被加载类提供字节码...因此,强烈建议,进行任何字节码instrumentation尝试都要谨慎,并且需要评估对部署应用程序、JVM /服务器节点甚至整个系统影响。 java达人 ID:drjava

1.3K61

hibernate5新特性展示

模式工具链 Session API类化 改进 OSGi 支持 改进 bytecode 增强功能 新引导API 用来引导Hibernate(建立一个SessionFactory)经典方式一直都是利用...从hibernate古老版本到现在,它一直支持用户按任意顺序添加新配置和关系映射,并允许我们在程序运行过程中查询获取相应状态和映射信息。但这也意味着我们不能根据一些实时配置高效地建立映射信息。...属性转换器支持 hibernate 5.0 极大地改进了对JPA2.1属性转换器支持: 1....整合了hibernate-envers 5. 集合数值,映射键值 6. 现在能够有效处理null 7....OSGi支持经过了很多改善,这需要归功了来自Karaf和Pax开发者和用户支持 改进 bytecode 增强功能 在hibernate5.0文档中已经对此进行了很多工作,但它仍有很大提升空间

1.4K40

谈谈阿里arthas背后原理

(String agentArgs, Instrumentation inst); /**  * 以Attach方式载入,在Java程序启动后执行  * jar包manifest需要配置属性Agent-Class...JVMTI能做事情包括: 获取所有线程、查看线程状态、线程调用栈、查看线程组、中断线程、查看线程持有和等待锁、获取线程CPU时间、甚至将一个运行中方法强制返回…… 获取Class、Method...、Field各种信息,类详细信息、方法体字节码和行号、向Bootstrap/System Class Loader添加jar、修改System Property…… 堆内存遍历和对象获取获取局部变量...这样,我们在方法实现中就可以把修改后字节码写回,实现 bytecode instrumentation。...Tomcat在配置Context(对应一个web应用,一个host下可以有多个context)时,有一个属性reloadable,当设置true时,会监听classpath下类文件变动情况,当它有变动时

1.8K41

NHibernate总结

NHibernate不仅仅管理.NET 类到数据库表映射(包括.NET 数据类型到SQL 数据类型映射),还提供数据查询和获取数据方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据时间...,其中People实体类中字段设置virtual。每个文件详细代码在下面介绍 (2)     在NH.Data层引用Nhibernate相关DLL ?... 注意:XML文件默认“复制到输出目录”“不复制”,这里需要修改为“始终复制”。...public virtual int Age { get; set; } public virtual string Sex { get; set; } }  注意:字段属性一定要设置...这正是NHibernate映射文件发挥作用地方。映射文件包含了对象/关系映射所需元数据。元数据包含持久化类声明和属性到数据库映射。

90340

谈谈Java Intrumentation和相关应用

* jar包manifest需要配置属性Premain-Class */ public static void premain(String agentArgs, Instrumentation...JVMTI能做事情包括: 获取所有线程、查看线程状态、线程调用栈、查看线程组、中断线程、查看线程持有和等待锁、获取线程CPU时间、甚至将一个运行中方法强制返回…… 获取Class、Method...、Field各种信息,类详细信息、方法体字节码和行号、向Bootstrap/System Class Loader添加jar、修改System Property…… 堆内存遍历和对象获取获取局部变量...这样,我们在方法实现中就可以把修改后字节码写回,实现 bytecode instrumentation。   ...  Tomcat在配置Context(对应一个web应用,一个host下可以有多个context)时,有一个属性reloadable,当设置true时,会监听classpath下类文件变动情况,

1K41

Hibernate配置文件详解-1

若只修改title属性,则SQL语句如下。 ? 可以看到SQL语句中只是对title一个字段进行了修改。 若将该属性设置false,表示关闭动态更新,再一次执行上述代码,看到结果如下。 ?...SQL语句只添加了title一个字段,其他字段全部默认。 若关闭动态添加,即将dynamic-insert设置false,同样再次执行上述代码,看到SQL如下。 ?...可以看到SQL语句给title,author,createTime3个字段全部赋值,当然只有title是有意义,其他两个字段全部null。 很显然,动态添加效率更高。...column:数据库表主键字段名。 unsaved-value:用来标志该实例是刚刚创建,尚未保存。可以用来区分对象状态。 access:Hibernate用来访问属性策略。...formula:一个SQL表达式,定义了这个计算属性。 access:Hibernate用来访问属性策略。 lazy:延迟加载策略。 unique:表示该字段是否唯一,默认为false。

1.3K20

Java匹马行天下之J2EE框架开发——Spring—>Spring框架知多少

Struts2:web层,比较简单(难点:ValueStack栈、拦截器) Hibernate:dao层,知识点杂(学了不用,默认设置够用了) Spring:service层,重要,(讲多少用多少)...它是为了解决企业应用开发复杂性而创建。该框架主要优势之一就是分层架构,分层架构允许使用者选择使用哪一个组件,同时 J2EE 应用程序开发提供集成框架。...该语言支持设置获取属性属性分配、方法调用、访问数组、集合和索引器内容、逻辑和算术运算、变量命名以及从SpringIOC容器中以名称检索对象。它还支持列表投影、选择以及常用列表聚合。...Spring-instrument模块:提供了类植入(Instrumentation)支持和类加载器实现,可以在特定应用服务器中使用。...Spring-orm模块:流行对象关系映射(Object-Relational Mapping)API提供集成层,包括JPA和Hibernate

89230

深入解析java虚拟机:详细类可用机制,类加载、链接、初始化

类文件解析器根据Java虚拟机规范以大端方式读取四个字节并检查是否正确魔数,然后检查主版本号,如此继续即可。 类加载最终任务是得到InstanceKlass对象。...方法调用会通过它进入解释器世界,该字段一经设置后面不再改变。通过它一定能进入解释器。 _from_interpreter_entry:解释器入口。...12)获取LC,标示C错误状态,通知所有线程,然后释放LC,以上一步E作为本步终止。 为了通用性和抽象性,可能《Java虚拟机规范》在语言描述方面比较学究。...,所以字段k和字段obj赋值都是在类初始化阶段完成,也正是因为赋值操作需要真实执行代码,所以需要在链接阶段提前设置解释器入口,以便初始化代码执行。...这样直接修改byteCode可能会造成虚拟机崩溃情况。 Instrumentation底层实现是基于JVMTI(Java虚拟机工具接口)RedefineClasses。

68730

实现一个javaagent需要几步?

ClassFileTransformer转换 // retransformation可以修改方法体,但是不能变更方法签名、增加和删除方法/类成员属性 void retransformClasses...创建一个包含premain()方法类 创建一个实现ClassFileTransformer接口Transfromer类 创建一个MANIFEST.MF文件,且这个文件Premain-Class配置项必须设置实现了...接下来,我们开始写代码,首先创建一个包含premain方法类,其中premain方法需要严格按照下面两种格式一种: //agentArgs是一个字符串,会随着jvm启动设置参数得到 //inst就是我们需要...然后执行Person.main方法,输出如下: 至此,我们已经掌握了简单javaagent实现方法,不过上面这种javaagent需要在jvm启动前设置-javaagent参数,但是很多时候,...之后要在META-INF/MAINIFEST.MF属性当中加入” Agent-Class”来指定拥有agentmain方法类。

67630

Hibernate【映射】续篇

-- 映射普通字段 父类属性直接引用就行了,比如name属性,直接写就行了!...鉴别器字段:作用是在数据库中区别每一个子类信息, 就是一个列 discriminator-value="cat_" 指定鉴别器字段,即type_字段 如果不指定,默认为当前子类全名 --...-- Animal下子类映射成一张表 指定子类类型,对应表 指定子类外键字段【需要对应Animal】 指定子类普通属性 --> <joined-subclass name="Cat...SQL 我们<em>即将</em>使用<em>的</em>是:每个子类映射成一张表,父类不对应表…这和我们传统方式继承是一样<em>的</em>。...-- 将子类<em>的</em>信息都映射成一张表 给出<em>属性</em><em>的</em>名称 <em>属性</em>对应<em>的</em>数据库表 普通<em>字段</em> --> <property

75160

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券