信息技术中文编码字符集,字节码是什么

1 字节码扩展技术字节码扩展技术是一种修改现有字节码或动态生成新字节码文件的技术。字节码的实现有多种方式,如下所示。

1.1 ASMASM可以直接生成.class字节码文件,并在类加载到JVM之前动态改变类的行为。 ASM的应用场景包括AOP(Cglib基于ASM)、热部署、修改其他jar包中的类。流程如下: (1)首先通过ClassReader读取编译好的.class文件。 (2)通过Visitor模式修改字节码。 常见的访客类别有:

修改方法修改MethodVisitor、FieldVisitor和变量访问AnnotationVisitor注释(3) 使用ClassWriter重新构建和编译修改后的字节码文件,或将修改后的字节码文件输出到Masu。

缺点ASM虽然可以达到修改字节码的效果,但代码实现层次较低,是虚拟机指令的集合。 IDEA 插件:ASM Bytecode Outline 可以将Java 代码转换为ASM 指令实现。

1.2 JavaAssist 可以使用Javassist实现字节码扩展,动态改变类的结构,动态生成类。编程被简化,因为你不需要了解虚拟机指令,可以直接使用Java编码。 JavaAssist的核心类是ClassPool、CtClass、CtMethod和CtField。

ClassPool:存储CtClass 的映射并通过classPool.get(类的完整路径名)检索CtClass。 CtClass:代码中类文件的抽象表示。 Ct方法:方法。 CtField:对应的类。由于ASM和JavaAssist属性和变量不足,只能修改加载前类内部的字节码,而无法修改和加载正在运行的JVM字节码文件。例子

package com.artemis.xm.agent;public class A { public void method(){ System.out.println(\’method.\’); }}public class JavassistTest { public static void main(String[] args) throws NotFoundException, CannotCompileException, IllegalAccessException, InstantiationException, IOException { ClassPool cp=ClassPool.getDefault(); CtClass cc=cp.get(\’com.artemis.xm.agent.A\’); CtMethod cm=cc.getDeclaredMethod(\’method\’); cm.insertBefore(\'{ System.out.println(\\\’start\\\’); }\’); cm.insertAfter(\'{ System.out.println(\\\’end\\\’); }\’); (); A a=(A) c.newInstance() a.method();

startmethod.end1.3instrumentJava从1.5开始就提供了java.lang.instrument,为Java程序提供了API来监控、收集性能信息、诊断问题等。 Instrumentation是java.lang.instrument包下的一个接口。该接口允许您修改加载和卸载的类。定义仪器接口

public Interface Instrumentation { //为Instrumentation注册一个类文件转换器,可以修改读取类文件的字节码。 void addTransformer(ClassFileTransformerTransformer, boolean canRetransform);//重新触发JVM加载的类的类加载void retransformClasses(Class .classes) throws UnmodifyingClassException; //当前JVM加载的所有类对象Get Class[] getAllLoadedClasses();调用Instrumentation#addTransformer设置转换器后,所有后续的JVM类在加载之前都会被这个转换方法拦截。 ClassFileTransformer接口定义

public Interface ClassFileTransformer { public byte[]transform(ClassLoaderloader,String className,Class classBeingRedependent, ProtectionDomain ProtectionDomain, byte[] classBytes) throws IllegalClassFormatException { //此处读取并转换类文件return classBytes }} ClassFileTransformer 接口的转换方法是。当类文件加载时,transform方法接收原始类文件的字节数组,可以使用ASM或Javassist重写接收到的字节码或生成新的字节码数组。

2 Java Agent2.1 Java 代理概述Java 代理使用instrumentation 接口(java.lang.instrument)创建代理,并使用instrumentation 的API 来读取和重写当前的JVM 类。 Java代理是一种特殊的Jar包,不能自行启动,必须附加到JVM进程中。 Java 代理有两种类型:premain 和Agentmain。 premain 代理:该代理类包含一个premain 方法。当JVM加载一个类时,它首先执行代理类的premain方法,然后执行Java程序本身的main方法。这就是premain 这个名字的由来。 premain 方法允许您在加载类文件之前对其进行修改。 Agentmain代理:JVM启动后通过JVMTI的Attach API机制远程加载。通过Attach API,您可以访问已启动的Java 进程并拦截类加载。从JDK 1.6 开始,检测支持在运行时更改类定义。

有两种类型的代理:在主程序之前运行的代理和在主程序之后运行的代理(前一种版本在1.6 及更高版本中可用)。

2.2 实现Java 代理使用Java 代理需要几个步骤。

定义MANIFEST.MF 文件。该文件必须包含Premain-Class 选项,通常还包含Can-Redefine-Classes 和Can-Retransform-Classes 选项。创建一个包含Premain-Class指定的premain方法的类,并将premain类和MANIFEST.MF文件打包成jar包。启动代理方法,参数为-javaagent: jar包路径。 2.2.1 为需要增强的类定义增强方法定义需要增强的类Cat

public class Cat { public void beginSleep() { while (true) { sleep(); try { Thread.sleep(5000L) } catch (InterruptedException e) { e.printStackTrace() } } System.out.println(\’猫在睡觉\’);

公共类PreMainTransformerimplements ClassFileTransformer { @Override 公共byte[]transform(ClassLoaderloader,String className,ClassclassBeingRefine,ProtectionDomainprotectionDomain,byte[]classfileBuffer) 抛出IllegalClassFormatException { if (!className.equals(\’com.dc.husky.agent.Cat\’)) { return null; } System.out.println(\’预主转换Class:\’ + className);

公共类AgentMainTransformerimplements ClassFileTransformer { @Override public byte[]transform(ClassLoaderloader,String className,ClassclassBeingRedefine,ProtectionDomainprotectionDomain,byte[]classfileBuffer) { System.out.println(\’agentMain transform Class:\’ + className); } ; ClassClassPath classPath=new ClassPath(this.getClass()); CtClass cc=cp.get(\’com.dc.husky.agent.CtMethod\’);=cc.getDeclaredMethod(\’sleep\’); System.out.println(\’start\’); }\’); m.insertAfter(\'{ System.out.println(\’end\’); }\’ ); return cc.toBytecode(); e.printStackTrace() }} 定义代理。

public class MyAgent { public static void premain(String AgentArgs, Instrumentation inst) { inst.addTransformer(new PreMainTransformer(), true); System.out.println(\’premain 代理已加载!\’); addTransformer(new AgentMainTransformer(), true); try { //重新定义类并加载新字节码inst.retransformClasses(Cat.class); System.out.println(\’Agent Load Done.\’ ); ) { System.out.println(\’加载代理失败!\’) } }}2.2.2 在资源目录中设置新目录META-INF,并添加该目录在.MF 文件

MANIFREST.MF 文件的作用

Premain-Class:包含premain 方法的类(类的完整路径名) Agent-Class:包含Agentmain 方法的类(类的完整路径名) Can-Redefine-Classes:true 表示该代理所需的类无法重新定义马苏。默认值为false(可选)。 Can-Retransform-Classes:true 意味着该代理可以重新定义它需要的类。 2.2.3 打包agent jar包添加以下插件打包maven pom agent jar 包

. org.apache.maven.plugins maven-assemble-plugin jar-with-dependency src/main/resources/META-INF/MANIFEST.MF 附加包2.2.4 目标JVM进程启动目标进程并获取JVM过程。皮多

public static void main(String[] args) { String name=ManagementFactory.getRuntimeMXBean().getName(); String s=name.split(\’@\’)[0]; //输出当前Pid 4375 System.out 。 println (\’pid:\’+s); Cat Cat cat=new Cat();}2.2.5 Attacher JVM 进程启动一个新的Attacher 进程并设置以下VM 参数。

-javaagent:/Users/**/IdeaProjects/huskey/huskey-agent/target/huskey-agent-1.0.0-SNAPSHOT-jar-with-dependency.jarAttacher进程代码

public class Attacher { public static void main(String[] args) { try { String pid=\’4375\’ VirtualMachine.attach(pid);Agent/Target/huskey-agent-1.0.0-SNAPSHOT-jar-with-dependency. jar\’); Thread.sleep(100000000) } catch (Exception e) { e.printStackTrace() }}2.3 重新加载类对执行的影响:首先,运行目标JVM 进程并获取pid。控制台每5 秒显示一次“cat is sleep”输出。接下来,启动Attacher 上的main() 方法并向其传递目标JVM 的PID。现在,如果您返回到目标JVM 的控制台,您将看到在打印“start”和“end”之前和之后每5 秒打印一次“cat is sleep”。即运行时字节码增强。已完成并且该类已重新加载。

本文和图片来自网络,不代表火豚游戏立场,如若侵权请联系我们删除:https://www.huotun.com/game/583597.html

(0)
上一篇 2024年5月25日
下一篇 2024年5月25日

相关推荐

  • 和平精英怎么闪枪? 和平精英怎么摇头闪枪?

    和平精英怎么闪枪? 通过在移动的过程中快速切换武器,达到闪枪的效果和平精英游戏中,是可以通过快速转换不同的武器来达成闪枪,即在使用枪械的过程中,很多玩家会在开枪射击时快速地更换到别的武器,比如手榴弹或冲锋枪等换完后,再切换回枪械,以达到秒杀敌人的效果这个操作需要玩家有良好的游戏经验和反应速度此外还可以结合游戏中的技能使用闪枪,游戏中有些角色的技能会提供加速、…

    游戏快讯 1小时前
  • 在和平精英里面买的皮肤从哪里找?

    在和平精英里面买的皮肤从哪里找? 查找方法是: 一首先登陆我们的游戏大区,在游戏的主页面找到右下角的军备的选项进入 二然后在这里我们可以看到有个军备库点击进入 三、最后玩家们就可以在此处查看自己的装备皮肤了 和平精英里面怎么抽皮肤? 点击军需再点击抽奖,有十连抽和单抽 和平精英里的和平人生怎么领皮肤? 和平精英里的和平人生没有办法免费领皮肤,但是可以自己买 …

    游戏快讯 4小时前
  • 和平精英雪地怎么写字?

    和平精英雪地怎么写字? .首先进入设置、通用设置选项,然后在通用设置界面中,依次点击进入键盘、键盘设置页面,接下来进入的键盘页面设置中,依次再次点击添加新键盘。 2.选择简体中文选项,再接下来在键盘中文输入法中,勾选上手写选项,然后点击右上角的完成即可,设置完成后,打开可输入文字的界面,然后长按输入左下角的球形图标,之后会弹出输入法选择选项,选择简体手写,即…

    游戏快讯 5小时前
  • 和平精英船怎么飞? 和平精英外骨骼怎么飞?

    和平精英船怎么飞? 和平精英船你要收集足够的油桶,然后把一颗手雷丢到船底下,然后你上船就会飞的很高所以就可以完成和平精英里面传飞的场景 和平精英外骨骼怎么飞? 打那个追猎模式,然后得到足够多的晶体,然后再去基站了,造腿 ,点两下跳就可以了飞了 和平精英900米怎么飞? 首先最好在跳伞前提前标好落地位置,当标记连线与飞机路径垂直时则是飞机与目标地点最近位置,这…

    游戏快讯 8小时前
  • 和平精英屏幕大小怎么调?

    和平精英屏幕大小怎么调? 一、和平精英怎么缩小屏幕: 1.先打开手机,然后打开手机上的和平精英,之后点击选择一个方式进行登录进入和平精英; 2.然后点击右下角的设置; 3.之后点击画面设置; 4.然后将屏幕亮度下方的滑动按钮向左或向右滑动来调整; 5.调整完成后,我们点击确认修改即可。 二、《和平精英》是由腾讯光子工作室群自研打造的军事竞赛体验手游,该作于2…

    游戏快讯 9小时前