如何拦截Java中的对象创建低于用户类级别
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何拦截Java中的对象创建低于用户类级别,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1353字,纯文字阅读大概需要2分钟。
内容图文
我正在寻找一些方法,通过使用Java代理或仪器类(最好是比用户类更低级别的东西)拦截JVM中的所有对象创建(新的或任何替代方法来创建Object),有一个similar question没有专注于Java代理或低于检测用户类的东西
解决方法:
可以通过几种不同的方式创建Java对象.
>从Java代码,当Java方法(解释或编译)执行以下字节码指令之一时:new,newarray,anewarray,multianewarray.
>从本机代码,当本机方法(包括标准类库中的方法)调用JNI函数之一时:NewObject,NewObjectArray,NewStringUTF,NewDirectByteBuffer等.
>直接来自VM运行时,当JVM在内部创建新对象时,例如,响应Object.clone(),Throwable.getStackTrace(),Class.getInterfaces()等.
不幸的是,没有一点可以从所有这些来源收集对象.但是,有办法拦截所有这些.
>从Java实例化的对象可以被Instrumentation代理捕获.代理程序需要定义一个ClassFileTransformer,它将扫描所有已加载类的字节码以获取对象创建指令并对其进行修改.
注意:没有必要拦截所有新指令,可以改为使用Object()构造函数.但是你仍然需要拦截数组分配指令.
> JVMI代理可以拦截JNI函数.您需要为NewObjectArray,NewStringUTF等定义自己的本机挂钩,然后替换JNI函数表.有关详细信息,请参阅JVMTI Reference.
> VM创建的对象可以在JVMTI Event Callback mechanism捕获.所需的事件是VMObjectAlloc.
注意:JVM不会为从Java或JNI函数分配的对象发布VMObjectAlloc事件.
对象实例化(克隆,反射,反序列化)的所有其他方式都属于上述类别之一.
从Oracle Java SE Downloads网站获取JDK 8演示和示例.
对于这个问题,有一个示例JVMTI代理.
看下
> jvmti / heapTracker
> jvmti / hprof
内容总结
以上是互联网集市为您收集整理的如何拦截Java中的对象创建低于用户类级别全部内容,希望文章能够帮你解决如何拦截Java中的对象创建低于用户类级别所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。