一般情况下,使用 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
分享到:
相关推荐
在使用java agent时,需要在命令行输入java可以看到相应的参数,其中有和java agent相关的:-agentlib:[=<选项>] 加载本机代理库 ,例如 -agentlib:hprof 另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help;...
标题中的"java JAVA_OPTS javaagent"涉及到Java应用程序的启动参数设置,特别是`JAVA_OPTS`环境变量和`javaagent`选项,这两个是Java虚拟机(JVM)启动时的关键配置项。`JAVA_OPTS`通常用于传递额外的JVM参数,如...
破解版本的JAR包,放到本地磁盘,ECLIPUS直接用,到JVM设置直接加 -noverify -javaagent:D:\javarebel.jar
学习和理解JavaAgent、Javaassist以及`VirtualMachine`的使用,不仅可以提升你的编程技能,还能让你在性能优化、故障排查等领域更加游刃有余。在实际开发中,这些技术常用于日志收集、分布式追踪、代码覆盖率测试等...
总的来说,javaagent和javassist的结合使用为Java开发者提供了强大的代码操作能力,允许我们在运行时对应用程序进行灵活的扩展和修改,极大地提升了开发的灵活性和效率。在实际项目中,如Spring AOP、AspectJ等框架...
通过这种方式,我们可以在不修改Spring Boot应用源代码的前提下,利用`javaagent`和`premain`方法实现对应用的动态增强,这对于开发工具、性能分析、调试等场景非常有用。需要注意的是,由于`premain`是在JVM启动时...
Java agent使用大全-编辑再发
2. **指定Agent参数**:在Java应用启动时,通过`-javaagent`参数指定Agent的路径和可选参数。例如:`-javaagent:/path/to/your/agent.jar=param1=value1,param2=value2`。 3. **操作类字节码**:Java Agent接收到...
- `-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 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马...
在此和大家分享JADE(全称Java Agent DEvelopment Framework)一个很酷的在Java上进行Agent开发的框架。你可以用这个框架很轻易的搭建一个MAS(多智能体系统),在这些系统中,各个Agent是自治的,而且可以互相通信...
- `conf`: 配置文件夹,可能包含SNMP Agent的配置参数和MIB配置。 - `snmpprojects`: 可能包含了SNMP相关的工程或示例代码。 - `tcs`: 可能是特定的通信服务或测试案例。 - `reference`: 可能包含参考文档或API...
使用`-javaagent`参数指定你的Agent jar路径,以及`premain`方法的参数,如果有的话。 7. **收集和展示数据**:在Agent中,你需要实现数据的收集和展示。这可能包括将统计信息记录到日志文件,或者通过Socket发送到...
java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/javaagent/javaagent.jar=/opt/javaagent/agent.properties就实现了方法级监控。其中=前指定的是jar包的路径,=后指定的是对agent的一些配置...
调试!!
https://pan.baidu.com/s/15TPev6CpXCRIPvXCIreMzA sbnh
java JVM 使用JavaAgent测试Object的大小
Java Agent是一种强大的技术,它允许我们在Java应用程序运行时对其进行拦截和增强,而无需修改源代码或重新部署。这种技术在系统监控、日志记录、性能分析、安全审计等多个领域都有广泛应用。本文将深入探讨如何使用...
2. **注册Agent**: 在Java命令行中,使用`-javaagent`选项指定Agent的路径和参数。例如: ```bash java -javaagent:/path/to/your/agent.jar=arg1=foo,arg2=bar -cp ... MainClass ``` 3. **使用`javassist`修改字节...