`
ezerg
  • 浏览: 274175 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

JavaRebel 关于 noverify 和 javaagent 参数的使用

阅读更多
一般情况下,使用  JavaRebel 时都配置两个 JVM 参数:-noverify 和 -javaagent
一、-javaagent 参数
这个参数是 JDK5 引入的,可以通过 java -h 查看其帮助信息
// 省略
-javaagent:<jarpath>[=<options>]
load Java programming language agent, see java.lang.instrument
// 省略

通过使用 -javaagent 参数,用户可以在执行 main 函数前执行指定 javaagent 包中的特定代码,甚至可以动态的修改替换类中代码。
javaagent 的代码与你的 main 方法在同一个 JVM 中运行,并被同一个 system classloader 装载,被同一的安全策略(security policy) 和上下文(context)所管理。

如何写一个 javaagent 程序呢?实现很简单,只需要在类中实现 premain 接口:
public static void premain(String agentArgs, Instrumentation inst)

例如可以动态将下面方法中的 true 改为 false
package testagent;
public class TestAgent {
	public boolean isOK() {
		return true;
	}
	public static void main(String[] args) {
		System.out.println(new TestAgent().isOK());
	}
}

package testagent;
import java.lang.instrument.Instrumentation;
public class MyTestAgent {
	public static void premain(String agentArgs,Instrumentation inst) {
		inst.addTransformer(new MyTestTransformer());
	}
}

package testagent;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;
public class MyTestTransformer implements ClassFileTransformer {
	@Override
	public byte[] transform(ClassLoader loader, String className,
			Class<?> classBeingRedefined, ProtectionDomain protectionDomain,
			byte[] classfileBuffer) throws IllegalClassFormatException {
		if(!className.equals("testagent/TestAgent"))
			return null;
		for(int i=0; i<classfileBuffer.length; i++) {
			if(classfileBuffer[i] == (byte)0x04 
					&& classfileBuffer[i+1] == (byte)0xAC) {
				classfileBuffer[i] = (byte)0x03;
			}
		}
		return classfileBuffer;
	}
}

// 注意:提前创建 META-INF/MANIFEST.MF 文件
jar -cvfm myagent.jar META-INF/MANIFEST.MF testagent/MyTestAgent.class testagent/MyTestTransformer.class

其中的 MANIFEST.MF 的内容如下:
Manifest-Version: 1.0
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Premain-Class: testagent.MyTestAgent

而运行方法则如下:
java -javaagent:myagent.jar testagent.TestAgent

二、-noverify 参数
通过使用 -noverify 参数,关闭 Java 字节码的校验功能。
当 ClassLoader 加载的Java 字节码时,字节码首先接受校验器(verifier)的校验。校验器负责检查那些指令无法执行的明显的破坏性的操作。校验器执行的检查操作:
1、变量要在使用之前进行初始化。
2、方法调用与对象应用类型之间要匹配。
3、访问私有数据和方法的规则没有被违反。
4、对本地变量的访问都在运行时堆栈内。
5、运行时堆栈没有溢处。

下面实际演示一下,手动修改 class 文件前后的情况。测试类文件如下:
package testverify;
public class TestVerify {
	public int test() {
		int i = 0, j = 1;
		return i+j;
	}
	public static void main(String[] args) {
		System.out.println(new TestVerify().test());
	}
}

执行: java testverify.TestVerify
结果:1

手动将十六进制代码 03 3C 04 3D 1B 1C 60 AC 部分 3D 改成 3C ,即从 istore_2 改为 istore_1 ,局部变量 1 被初始化两次,而局部变量 2 未被初始化。
执行:java testverify.TestVerify
结果:Exception in thread "main" java.lang.VerifyError: (class: testverify/TestVerify,
method: test signature: ()I) Accessing value from uninitialized register 2
Could not find the main class: testverify.TestVerify.  Program will exit.

执行:java -noverify testverify.TestVerify
结果:1


1
9
分享到:
评论

相关推荐

    java agent使用全解析

    在使用java agent时,需要在命令行输入java可以看到相应的参数,其中有和java agent相关的:-agentlib:[=&lt;选项&gt;] 加载本机代理库 ,例如 -agentlib:hprof 另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help;...

    java agent注册为windows服务

    wrapper.java.additional.1=-javaagent:path/to/your/agent.jar ``` 6. **启动服务**:现在,当JSW启动Java应用程序时,它会先加载我们的Java Agent,然后由Agent完成服务注册。之后,你可以通过Windows服务管理...

    javaagent使用指南-rickiyang1

    在实际应用中,Javaagent 经常与字节码操作库如 ByteBuddy 或 ASM 结合使用,以方便地生成和修改字节码。例如,BTrace 和 Arthas 就是利用 Javaagent 来实现动态跟踪和诊断的工具。 总之,Javaagent 提供了一种在...

    java JAVA_OPTS javaagent

    标题中的"java JAVA_OPTS javaagent"涉及到Java应用程序的启动参数设置,特别是`JAVA_OPTS`环境变量和`javaagent`选项,这两个是Java虚拟机(JVM)启动时的关键配置项。`JAVA_OPTS`通常用于传递额外的JVM参数,如...

    java项目实现热更源码-javaagent

    2. **指定Agent参数**:在Java应用启动时,通过`-javaagent`参数指定Agent的路径和可选参数。例如:`-javaagent:/path/to/your/agent.jar=param1=value1,param2=value2`。 3. **操作类字节码**:Java Agent接收到...

    java 代理例子 -javaagent,premain方式实现

    通过这种方式,我们可以在不修改Spring Boot应用源代码的前提下,利用`javaagent`和`premain`方法实现对应用的动态增强,这对于开发工具、性能分析、调试等场景非常有用。需要注意的是,由于`premain`是在JVM启动时...

    javarebel(java热启jar包及所需文件)

    解压后包含以下3个文件 javarebel.jar javarebel.stats javarebel-bootstrap.jar 使用方法: 打开MyeEclispe-&gt;Window-&gt;Prefrence窗口,找到设置tomcat位置下JDK设置...-noverify-javaagent:d:\javatools\javarebel.jar

    jmx_prometheus_javaagent-0.12.0.jar

    代理Java包,用于生成JVM的健康的数据,jmx_prometheus_javaagent-0.12.0.jar

    Burp Suite Pro2022.2 Beta最新版

    它使用多种智能技术对一个应用程序的内容和功能进行全面的清查。 Burp Spider 通过跟踪 HTML 和 JavaScript 以及提交的表单中的超链接来映射目标应用程序,它还使用了一些其他的线索,如目录列表,资源类型的注释,...

    基于Java Agent实现的自测联调Mock利器.zip

    基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip...

    JADE(Java Agent DEvelopment Framework):一个Agent,多Agent系统的开发框架

    在此和大家分享JADE(全称Java Agent DEvelopment Framework)一个很酷的在Java上进行Agent开发的框架。你可以用这个框架很轻易的搭建一个MAS(多智能体系统),在这些系统中,各个Agent是自治的,而且可以互相通信...

    snmp java agent工具

    - `conf`: 配置文件夹,可能包含SNMP Agent的配置参数和MIB配置。 - `snmpprojects`: 可能包含了SNMP相关的工程或示例代码。 - `tcs`: 可能是特定的通信服务或测试案例。 - `reference`: 可能包含参考文档或API...

    idea maven 搭建java agent项目,手把手教你实现方法耗时统计的java agent.zip

    使用`-javaagent`参数指定你的Agent jar路径,以及`premain`方法的参数,如果有的话。 7. **收集和展示数据**:在Agent中,你需要实现数据的收集和展示。这可能包括将统计信息记录到日志文件,或者通过Socket发送到...

    Java Agent源码(带Jar包)

    在源码中,我们可能会看到如何注册和使用Java Agent的示例,这通常涉及到`-javaagent`命令行参数的使用,以及`Premain-Class`和`Agent-Class` manifest条目的配置。同时,源码可能包含如何利用Instrumentation API来...

    基于Bytebuddy的Java Agent AOP框架.zip

    Java Agent是一种在JVM级别对程序进行...通过学习和实践,我们可以掌握如何使用ByteBuddy来创建高效、灵活的代理类,以及如何利用Java Agent实现字节码级别的方法拦截,从而提升我们的编程技巧和对Java底层机制的理解。

    JavaAgent:Javassist 与 Asm JavaAgent 字节码动态编程项目

    JavaAgent是一种强大的技术,它允许在程序运行时对Java类进行拦截和修改,极大地扩展了Java平台的功能。在这个“JavaAgent: Javassist与Asm JavaAgent字节码动态编程项目”中,我们将深入探讨如何利用Javassist和ASM...

    java-agent演示项目,修改Java源代码_java-agent-demo.zip

    java-agent演示项目,修改Java源代码_java-agent-demo

    手把手教你实现一个Java Agent.pdf

    4. 在启动JVM时通过`-javaagent`参数指定Agent的jar路径及参数,或者在运行时通过Attach API动态加载。 这个过程可能涉及的细节很多,包括字节码的理解、选择合适的字节码库、正确处理类的加载顺序等。但一旦熟悉了...

    Java Agent实现系统数据采集

    Java Agent是一种强大的技术,它允许我们在Java应用程序运行时对其进行拦截和增强,而无需修改源代码或重新部署。这种技术在系统监控、日志记录、性能分析、安全审计等多个领域都有广泛应用。本文将深入探讨如何使用...

    apache-skywalking-java-agent-8.9.0

    SkyWalking Java Agent能够监控JVM的内存使用情况、线程状态、垃圾回收(GC)行为,以及CPU负载等关键指标,帮助开发者识别潜在的性能问题。 3. **分布式追踪**:SkyWalking提供强大的分布式追踪能力,允许开发者...

Global site tag (gtag.js) - Google Analytics