当前位置: 首页 > news >正文

正规的企业网站建设公司站长资源平台

正规的企业网站建设公司,站长资源平台,盘锦建设小学网站,WORDPRESS主机选择上一篇从Arthas的源码引出了Java动态字节码技术#xff0c;那么这一篇就从几种Java字节码技术出发#xff0c;看看Arthas是如何通过动态字节码技术做到无侵入的源码增强#xff1b; Java大部分情况下都是解释执行的#xff0c;也就是解释.class文件#xff0c;所以如果我们…上一篇从Arthas的源码引出了Java动态字节码技术那么这一篇就从几种Java字节码技术出发看看Arthas是如何通过动态字节码技术做到无侵入的源码增强 Java大部分情况下都是解释执行的也就是解释.class文件所以如果我们想对原代码进行增强的话直接接的手段便是从源文件.java入手使用静态代理、动态代理、装饰器等设计模式进行功能增强。但很多时候我们作为第三方没有机会、不方便拿到源码时这条路就走不通了此时如果还是想继续其进行功能增强的话那么只剩一条路了就是直接对.class文件下手。 但对于二进制的.class文件还有多少人能分清魔数、标识符、各种区域表示的内容呢所以直接操作字节码也似乎不太现实那有没有什么抓手呢 ASM ASM 是 assembly 汇编 的简称所以它更偏底层、更贴近底层字节码所以也就更难使用、更晦涩。 整体思路上是通过Reader将.class文件读取后通过一系列API来增强源码之后通过Writer生成新的.class文件。 个人不太建议使用这种方式学习和使用成本都比较高不直观太晦涩。 Javaassist 相比于ASM理解起来不要太简单不需要了解底层虚拟机指令和晦涩的API只需要掌握四个核心类即可 ClassPool、CtClass、CtMethod、CtField CtClasscompile-time class编译时 - 类对象Java中万物皆对象CtClass是Class在编译时的对象可以通过类的全限定名来获取到这个CtClass 与编译时(compile)类对象相似的我们平时用反射获取到的是运行时(Runtime)类对象 ClassPool可以把它简单的理解为一个HashMap类的全限定名作为key可以从中获取到CtClass CtMethod CtField类中的方法和属性 利用以上四个类可以快速实现对源码的增强比如当你想实现AOP在原方法执行前和执行后添加功能的时候只需要先通过ClassPool获取到CtClass再获取到CtMethod后就可以调用该方法的insertBefore和insertAfter插入具体代码块了。 Instrument Instrument是JVM提供的一个对已加载的类进行修改的接口(Interface)打开java.lang.Instrumentation可以看到清晰的说明。 首先Instrument是基于 Java Agent技术的也就是上一篇中提到的用 agentmain 和 premain attache java进程生成的 agent也就是为 Instrument 在运行的进程中开了一个后门。 在instrument接口中最重要的方法是 通过ClassFileTransformer 对原class进行 retransform 在ClassFileTransformer中实现想要对原class的增强该接口只有一个需要被子类实现的方法就是transform方法 package java.lang.instrument;public interface ClassFileTransformer {byte[]transform( ClassLoader loader,String className,Class? classBeingRedefined,ProtectionDomain protectionDomain,byte[] classfileBuffer)throws IllegalClassFormatException; }举一个直观的例子福报厂的ttl threadpool package com.alibaba.ttl.threadpool.agent;public class TtlTransformer implements ClassFileTransformer {//类似于责任链可以添加一系列的 ClassFileTransformer//值得注意的是这里使用到了Javassistprivate final ListJavassistTransformlet transformletList new ArrayListJavassistTransformlet();TtlTransformer(List? extends JavassistTransformlet transformletList) {for (JavassistTransformlet transformlet : transformletList) {this.transformletList.add(transformlet);logger.info([TtlTransformer] add Transformlet transformlet.getClass() success);}}Overridepublic final byte[] transform(Nullable final ClassLoader loader, Nullable final String classFile, final Class? classBeingRedefined,final ProtectionDomain protectionDomain, NonNull final byte[] classFileBuffer) {final String className toClassName(classFile);//通过classloader和classname加载了原class对象ClassInfo classInfo new ClassInfo(className, classFileBuffer, loader);//对原class对象依次应用 ClassFileTransformer并返回transform后的新class对象for (JavassistTransformlet transformlet : transformletList) {transformlet.doTransform(classInfo);if (classInfo.isModified()) return classInfo.getCtClass().toBytecode();}} }这时就可以回到上一篇中Arthas的核心启动类ArthasBootstrap transformerManager new TransformerManager(instrumentation); 在TransformerManager中有三类增强功能watcher/tarce/其余的归为reTransformers public TransformerManager(Instrumentation instrumentation) {this.instrumentation instrumentation;classFileTransformer new ClassFileTransformer() {Overridepublic byte[] transform(ClassLoader loader, String className, Class? classBeingRedefined,ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {for (ClassFileTransformer classFileTransformer : reTransformers) {byte[] transformResult classFileTransformer.transform(loader, className, classBeingRedefined,protectionDomain, classfileBuffer);if (transformResult ! null) {classfileBuffer transformResult;}}for (ClassFileTransformer classFileTransformer : watchTransformers) {byte[] transformResult classFileTransformer.transform(loader, className, classBeingRedefined,protectionDomain, classfileBuffer);if (transformResult ! null) {classfileBuffer transformResult;}}for (ClassFileTransformer classFileTransformer : traceTransformers) {byte[] transformResult classFileTransformer.transform(loader, className, classBeingRedefined,protectionDomain, classfileBuffer);if (transformResult ! null) {classfileBuffer transformResult;}}return classfileBuffer;}};instrumentation.addTransformer(classFileTransformer, true); }以其中的Watcher为例子看下Arthas底层是如何增强源码的 //继承java.lang.instrument包中的 ClassFileTransformer 接口 public class Enhancer implements ClassFileTransformer {Overridepublic byte[] transform(final ClassLoader inClassLoader, String className, Class? classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {//底层是ASMClassNode classNode new ClassNode(Opcodes.ASM9);//首先获取原class对象ClassReader classReader AsmUtils.toClassNode(classfileBuffer, classNode);classNode AsmUtils.removeJSRInstructions(classNode);ListMethodNode matchedMethods new ArrayListMethodNode();for (MethodNode methodNode : classNode.methods) {if (!isIgnore(methodNode, methodNameMatcher)) {matchedMethods.add(methodNode);}}for (MethodNode methodNode : matchedMethods) {if (AsmUtils.isNative(methodNode)) {continue; //过滤调native方法}if(AsmUtils.containsMethodInsnNode(methodNode, Type.getInternalName(SpyAPI.class), atBeforeInvoke)) {... //对class的方法添加watch功能}}return AsmUtils.toBytes(classNode, inClassLoader, classReader); //返回新的class对象} }
http://www.dnsts.com.cn/news/45630.html

相关文章:

  • 网站域名空间合同sae安装wordpress
  • 迅速上排名网站优化wordpress 搜索摘要
  • 文明网站机制建设2021年十大购物网站排名
  • 线上做网站赚钱玩游戏的网页
  • win10使用dw做网站ui设计案例欣赏分析
  • 快速网站seo效果沈阳建设工程城乡建设厅
  • 做护理简历的网站智库门户网站建设
  • 中文网站建设计划书wordpress指定页面连接数据库
  • 域名及对应网站建筑装饰设计资质
  • 平邑住房和城乡建设局网站网站设计定制多少钱
  • 吉林省城乡建设部网站哪个网站可以做头像
  • 导购网站怎么建立京东商城网站风格
  • 台州网站建设推广网站排名效果好
  • 一个内部网站如何做外网映射义乌网站建设zisou8
  • 郑州网站建设专注乐云seo网站举报查询进度
  • 浙江省工程建设管理质量协会网站网站建设咨询有客诚信网站建
  • 正规网站制作全包wordpress 4.9 漏洞
  • 做外贸网站怎么访问外国网站微信小程序表单制作
  • a5站长平台企业网站留言板
  • 锦州企业网站建设怎么做跨境电商开店
  • 有什么教做甜品的网站网站做app的软件叫什么
  • 网站推广seo医院网站建设方案青岛卓信
  • 网站开发的微端是什么企梦云网站建设
  • 完整域名展示网站源码网站开发源代码mvc
  • 上海怎么做网站vps网站管理助手教程
  • 建设银行网上流览网站wordpress读取mysql
  • 三亚谁做网站h5网站建设 北京
  • php网站开发实例教程源码音乐网站数据库怎么做
  • 微网站开发费用电子商务网站保密协议
  • 网站设计扁平化WordPress 输入页码分页