`
ezerg
  • 浏览: 273492 次
  • 性别: 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 JAVA_OPTS javaagent

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

    javarebel 用JAVA和ROR一样方便测试

    破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar

    JavaAgent例子-agentmain方式

    学习和理解JavaAgent、Javaassist以及`VirtualMachine`的使用,不仅可以提升你的编程技能,还能让你在性能优化、故障排查等领域更加游刃有余。在实际开发中,这些技术常用于日志收集、分布式追踪、代码覆盖率测试等...

    javaagent+javassist

    总的来说,javaagent和javassist的结合使用为Java开发者提供了强大的代码操作能力,允许我们在运行时对应用程序进行灵活的扩展和修改,极大地提升了开发的灵活性和效率。在实际项目中,如Spring AOP、AspectJ等框架...

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

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

    Java agent使用大全

    Java agent使用大全-编辑再发

    jmx_prometheus_javaagent-0.12.0.jar

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

    java项目实现热更源码-javaagent

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

    javarebel安装指南.pdf

    - `-noverify-javaagent:F:\lib\javarebel\javarebel.jar` (根据实际情况替换路径) - `-Drebel.dirs=(%你的WEB应用%)\WEB-INF\classes` (这里指的是Web项目的class文件夹路径) - `-Drebel.spring_plugin=true` ...

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

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

    不那么一样的 Java Agent 内存马.zip

    不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java 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发送到...

    javaagent:基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志

    java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/javaagent/javaagent.jar=/opt/javaagent/agent.properties就实现了方法级监控。其中=前指定的是jar包的路径,=后指定的是对agent的一些配置...

    jmx_prometheus_javaagent-0.13.0.jar

    https://pan.baidu.com/s/15TPev6CpXCRIPvXCIreMzA sbnh

    java JVM 使用JavaAgent测试Object的大小

    java JVM 使用JavaAgent测试Object的大小

    Java Agent实现系统数据采集

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

    java agent demo

    2. **注册Agent**: 在Java命令行中,使用`-javaagent`选项指定Agent的路径和参数。例如: ```bash java -javaagent:/path/to/your/agent.jar=arg1=foo,arg2=bar -cp ... MainClass ``` 3. **使用`javassist`修改字节...

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

    Java Agent的核心是`java.lang.instrument.Instrumentation`接口,该接口提供了类加载前和类加载后的字节码操作能力。在Java中,通过`PreMain-Class`属性启动Agent或者使用`instrument.addTransformer`方法将自定义...

Global site tag (gtag.js) - Google Analytics