当前位置: 首页 > 网络应用技术

探针技术 - 贾瓦格特和字节码增强的技术字体好友

时间:2023-03-07 01:56:57 网络应用技术

  它是一个代码生成和操作库,用于创建和修改应用程序在无需编译器的帮助时运行时。它不限于用于创建用于运行代理的接口的接口。此外,方便的API可用于使用代理或在施工过程中手动更改类。

  官方网站:

  Java是一种强大的编程语言类型,也就是说,所有变量和对象都有一定的类型。如果该类型在分配操作中不兼容,则会抛出例外。在大多数情况下,史式检查是可行的,但是在某些特殊情况下,强大的类型检查已成为巨大的障碍。

  当我们进行一些通用工具包装时,类型检查已成为一个很大的障碍。例如,如果我们编写通用DAO来实现数据操作,我们不知道用户要如何调用一些参数,每个参数的哪些类型,以及哪些类型的需求发生变化。任何类型都定义为我们的大多数通用工具包装都使用了反射机制。通过反思,我们可以知道用户调用的方法或字段,但是Java反射中有许多缺陷:

  Java编程语言代码生成库不是一个字节好友。以下代码生成库在Java中也非常受欢迎:

  JAVA代理是JDK随附的代理工具,它允许生成代理类以实现一系列接口。Java代理要求目标类必须实现该接口是一个很大的限制。例如,在某些情况下,目标类不会实现任何接口,也无法修改目标类代码实现。Java代理不能扩展和增强它。

  CGLIB出生于Java的早期,但不幸的是没有跟上Java平台的开发。尽管CGLIB本身是一个非常强大的图书馆,但它已经变得越来越复杂。在这种情况下,许多用户都给出了这一点。向上cglib。

  Javassist的使用对Java开发人员非常友好。它使用Java源代码字符串和Javassist提供的一些简单的API来共同撰写用户所需的Java类。该类已编译为字节码,并在运行程序时加载到JVM。Java语法的使用类似于编写Java代码,但是Javassist编译器无法与Javac编译器进行性能进行比较,并且在获得更复杂的逻辑时很容易犯错。

  Byte Buddy提供了非常灵活且强大的特定语言领域。通过编写一个简单的Java代码来创建自定义的运行类。在同一时间,Byte Buddy也具有非常开放的自定义化,并且可以满足不同复杂性的需求。

  在上述所有代码生成技术中,我们建议使用字节好友,因为字节好友代码会生成最高的性能。字节好友的主要重点是生成更快的代码,如下所示:

  让我们详细解释字节好友API,以分析重要的方法和类。

  1.2.1字节性语法,由字节buddy类的实例完成,由字节伙伴创建/增强的任何类型。让我们首先学习Bytebuddy类,如下:以下代码:

  总字节好友的动态增强代码有三种方式:

  在以上三种方式完成类的增强后,我们获得了一个对象,表明一种未加载的类型。我们可以使用这种类型。提供几种类型的加载策略。这些负载策略是在中间定义的,其中:

  实施如下:

  前一个动态中动态生成的类型仅继承对象类。在实际应用中动态新型类型的一般目的是增强原始方法。以下示例显示了字节好友如何增强方法:

  首先,您需要注意此处的方法()方法。方法()方法可以匹配多种方法,这些方法需要通过传输元素调整参数来修改。这是根据方法名称匹配ToString()方法的方法名称。如果同时有多个加载方法,则可以使用elementMatcher的其他API描述方法的签名,如下所示:

  接下来要注意的是方法。该方法拦截的所有方法都将确定如何增强该方法指定的对象。该方法的实现将在此处修改为固定值。上面的示例是固定的返回字符串。

  可以将多个和方法设置为拦截和修改,这将按堆栈的顺序进行拦截。

  1.2.2 Bytebuddy Case创建一个项目,添加以下坐标

  我们首先创建一个普通的类,然后为此类创建代理类,然后创建代理以拦截该方法。

  1)普通班

  创造

  2)代理测试

  3)创建拦截器并编写拦截器方法:

  在我们使用的程序中,它可以将截然目标方法委托给其他对象。以下是我们首先解释的一些注释:

  运行测试结果:

  使用Skywalking时,程序中没有Java代码修改。在这里,我们使用了Java代理技术。我们将开始学习Java代理技术。

  Java特工的技术对大多数人来说更不熟悉,但是每个人都受到了更多的影响。实际上,我们通常使用的许多工具基于Java代理,例如:Hot Exployment Tool Jrebel,Jrebel,Jrebel,Isspringboot的热部署插头,各种在线诊断工具(Btrace,Grays,Grays),Ali的开源Arthas等。

  实际上,在JAVA代理之后,在JDK1.5之后,我们可以使用代理技术来构建独立于应用程序的代理程序(IE代理),以帮助监视,运行甚至替换其他JVM.机器级别的AOP函数,此方法的这种方法是典型的优势,不是代码入侵。

  代理分为两种类型:

  1.代理在主程序之前运行,

  2.代理按照主程序(以前的升级版本,1.6之后提供)运行。

  2.2.1 PREMAINPREMAIN:代理在主计划之前运行

  在实际使用中,Javaagent是Java命令的参数。当我们通过Java命令启动应用程序时,您可以通过参数-Javaagent指定JAR软件包(即我们的代理代理),该参数可以实现特定方法在应用程序的主要程序操作之前,我们指定的JAR软件包。在这种方法中,我们可以实现动态增强类和其他相关功能,并且JAR软件包具有2个要求:

  从字面上看,Premain-class是在主函数之前运行的类。当Java虚拟机启动时,在执行主函数之前,JVM将在JAR软件包中指定的Premain-Class类中运行Premain方法。

  我们可以通过输入命令行看到相应的参数,该参数与Java代理有关

  请参阅上述参数。这是中间定义的软件包。这条道路下有两个重要的类:

  该软件包提供了一些工具,可以帮助开发人员在运行Java程序时动态修改系统中的类类型。在它们的情况下,使用软件包的关键组件是Javaagent。本质上,Java代理是一组严格的常规Java类。如上所述,Javaagent命令要求指定类中必须有Premain()方法,并且还需要对Premain方法的签名。签名必须符合以下两种格式:

  JVM将优先考虑加载签名的方法,然后成功加载第二个签名。如果不是第一个,则将第二种方法加载

  演示:

  1.在中间添加以下坐标

  2.编写代理程序:完成方法的签名,首先制作一个简单的输出

  让我们简要介绍仪器中的核心API方法:

  3.打包项目并获取

  4.创建一个项目并写一个类:

  5.开始运行,添加参数

  运行结果:

  总结:

  该代理JVM将首先执行Premain方法,并且大多数类加载将通过此方法。请注意,其中大多数不是全部。当然,遗漏主要是系统类,因为许多系统类在代理中首先执行,并且用户类的加载肯定会截获。换句话说,此方法是拦截在主要方法开始之前,大多数分类加载活动。由于您可以拦截类的加载,因此可以进行重写类的操作。结合第三方字节汇编工具,例如第三方字节码编译工具,例如第三方,例如字节码编译工具,例如第三方,例如bytecode汇编工具,例如第三方,例如第三方,例如字节码编译工具,例如第三派对字节汇编工具,例如第三部分字节委员会编译工具,例如,by bybuddy,javassist,cglib等,以翻新实现类。

  2.2.2代理商

  以上以JDK 1.5提供。开发人员只能在主加载之前加入手和脚。Java SE 6:AgentMain提供了一种新的代理操作方法,该方法可以在主函数启动后运行。

  像功能一样,开发人员可以使用以下方法之一编写包含功能的Java类

  还需要在subtest.mf文件中设置“代理类”,以指定包含AgentMain函数类的完整路径。

  1:在AgentDemo中创建一个新类:并编写方法Agenmain

  2:将配置添加到pom.xml如下

  3:包装重新包装

  4:查找应用程序,修改以下内容:

  List()方法将找到当前系统中运行的所有JVM进程。您可以打印以查看当前系统中正在运行的JVM进程。由于执行主函数,因此该进程名称称为当前类名称,因此您可以以这种方式找到当前的进程ID。

  注意:安装在Mac上的JDK可以直接找到虚拟机类,但是找不到Windows中安装的JDK。如果遇到这种情况,请手动安装JDK安装目录:Lib Directory.jar中的工具。将添加到当前项目的库中。

  之所以像这样编写的原因:代理在运行主程序后加载,并且我们无法在主程序中编写加载代码。我们只能编写另一个程序。那么我该如何与主程序进行通信?这里使用的机制是附件机制,它可以将JVM A连接到JVM B并将指令发送给JVM B执行。

  总结:

  以上是Java代理的两个简单的小栗子。Java代理非常强大。它可以做的不仅要打印一些监视值,而且还使用高级别的功能(例如变压器)进行类替换。相关的API需要深入了解字节码和其他技术。

  要求:通过Java代理技术消耗统计方法的案例

  1.将方法添加到项目:

  并调用该方法

  2.中间的改革

  在项目中,创建统计截距,代码如下:

  3.再次返回,然后再次测试操作中的主类

  测试效果如下:

  本文由Chuanzhi Education Scholars Valley Wild建筑教学和研究团队发表。如果本文对您有所帮助,请注意并喜欢;如果您有任何建议,则可以发表评论或私人消息。您的支持是我坚持创建的动态重印。请指示来源!