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

zf厂手表网站什么是网络营销传播

zf厂手表网站,什么是网络营销传播,免备案空间主机,wordpress自定义搜索尽管Java初学者很快学会了键入public static void main来运行他们的应用程序#xff0c;但是即使是经验丰富的开发人员也常常不知道JVM对Java流程的两个附加入口点的支持#xff1a; premain和agentmain方法。 这两种方法都允许所谓的Java代理在驻留在其自己的jar文件中的同时… 尽管Java初学者很快学会了键入public static void main来运行他们的应用程序但是即使是经验丰富的开发人员也常常不知道JVM对Java流程的两个附加入口点的支持 premain和agentmain方法。 这两种方法都允许所谓的Java代理在驻留在其自己的jar文件中的同时对现有Java程序做出贡献即使没有被主应用程序显式链接。 这样做有可能与托管它们的应用程序完全独立地开发发行和发布Java代理同时仍在同一Java进程中运行它们。 最简单的Java代理先于实际应用程序运行例如执行一些动态设置。 代理可以例如安装特定的SecurityManager或以编程方式配置系统属性。 下面的类是一个不太有用的代理仍然可以作为良好的入门演示在将控制权传递给实际应用程序的main方法之前该类仅将一行打印到控制台 pre class wp-block-syntaxhighlighter-code package sample; public class SimpleAgent? { public static void premain(String argument) { System.out.println( Hello argument); } } /pre 要将此类用作Java代理需要将其包装在jar文件中。 除常规Java程序外无法从文件夹加载Java代理的类。 另外需要指定一个清单条目该清单条目引用包含premain方法的类 Premain-Class: sample.SimpleAgent 通过此设置现在可以在命令行上添加Java代理方法是指向捆绑代理的文件系统位置并可以选择在等号后添加单个参数如下所示 java -javaagent/location/of/agent.jar世界some.random.Program 现在在some.random.Program执行main方法之前将打印出Hello World 其中第二个单词是所提供的参数。 仪表API 如果抢占式代码执行是Java代理的唯一功能那么它们当然将没有多大用处。 实际上大多数Java代理仅是有用的因为Java代理可以通过将类型为Instrumentation的第二个参数添加到代理的入口点方法来请求Java代理请求。 仪器API提供对Java代理专有的JVM提供的较低级别功能的访问而JVM从不提供给常规Java程序。 工具API的核心是允许在Java类加载之前或之后对其进行修改。 任何已编译的Java类都存储为.class文件该文件在首次加载时以字节数组的形式呈现给Java代理。 通过将一个或多个ClassFileTransformer注册到检测API来通知代理该API会针对当前JVM进程的ClassLoader加载的任何类得到通知 package sample; public class ClassLoadingAgent { public static void premain(String argument, Instrumentation instrumentation) { instrumentation.addTransformer(new ClassFileTransformer() { Override public byte[] transform(Module module, ClassLoader loader, String name, Class? typeIfLoaded, ProtectionDomain domain, byte[] buffer) { System.out.println( Class was loaded: name); return null; } }); } } 在上面的示例中代理通过从转换器返回null来保持不运行状态这使转换过程中止但是仅将带有最近加载的类的名称的消息打印到控制台。 但是通过转换buffer参数提供的字节数组代理可以在加载任何类之前更改其行为。 转换已编译的Java类可能听起来很复杂。 但是幸运的是 Java虚拟机规范JVMS详细说明了代表类文件的每个字节的含义。 为了修改一种方法的行为因此将识别该方法代码的偏移量然后向该方法添加所谓的Java字节代码指令以表示所需的已更改行为。 通常这种转换不是手动应用的而是通过使用字节码处理器最著名的是ASM库将类文件拆分为组件的应用。 这样就可以孤立地查看字段方法和注释从而可以应用更有针对性的转换并节省一些记账。 无干扰的代理 尽管ASM使类文件转换更安全更简单但它仍然依赖于库用户对字节码及其特征的良好理解。 但是其他通常基于ASM的库允许在更高级别上表达字节码转换这使得这种理解成为必然。 此类库的一个示例是Byte Buddy 它由本文的作者开发和维护。 Byte Buddy旨在将字节码转换映射到大多数Java开发人员已经知道的概念以使代理开发更容易上手。 为了编写Java代理Byte Buddy提供了AgentBuilder API该API在ClassFileTransformer创建并注册ClassFileTransformer 。 字节好友ClassFileTransformer直接注册ClassFileTransformer 而是允许指定ElementMatcher来首先标识感兴趣的类型。 对于每种匹配类型然后可以指定一个或多个转换。 然后Byte Buddy将这些指令转换为可以安装到Instrumentation API中的转换器的高性能实现。 例如以下代码在Byte Buddy的API中重新创建了先前的非运行转换器 package sample; public class ByteBuddySampleAgent { public static void premain(String argument, Instrumentation instrumentation) { new AgentBuilder.Default() . type (ElementMatchers.any()) .transform((DynamicType.Builder? builder, TypeDescription type , ClassLoader loader, JavaModule module) - { System.out.println( Class was loaded: name); return builder; }).installOn(instrumentation); } } 应该提到的是与前面的示例相反Byte Buddy将转换所有发现的类型而无需应用更改而后者将完全忽略那些不需要的类型效率较低。 另外如果没有另外指定默认情况下它将忽略Java核心库的类。 但是实质上可以达到相同的效果从而可以使用上述代码演示使用Byte Buddy的简单代理。 使用Byte Buddy建议测量执行时间 字节伙伴不是将类文件公开为字节数组而是尝试将常规Java代码编织或链接到已检测类中。 这样Java代理的开发人员无需直接产生字节码而可以依赖于Java编程语言及其与之已有关系的现有工具。 对于使用Byte Buddy编写的Java代理行为通常由建议类表示在这些类中带注释的方法描述了添加到现有方法的开头和结尾的行为。 例如以下建议类用作模板该模板将方法的执行时间打印到控制台 public class TimeMeasurementAdvice { Advice.OnMethodEnter public static long enter() { return System.currentTimeMillis(); } Advice.OnMethodExit(onThrowable Throwable.class) public static void exit (Advice.Enter long start, Advice.Origin String origin) { long executionTime System.currentTimeMillis() - start; System.out.println(origin took executionTime to execute ); } } 在上面的建议类中enter方法仅记录当前时间戳并返回该时间戳以使其在方法末尾可用。 如图所示在实际方法主体之前执行输入建议。 在方法结束时将应用退出建议在该建议中将从当前时间戳中减去所记录的值以确定该方法的执行时间。 然后将执行时间打印到控制台。 为了利用建议需要将其应用在先前示例中仍未运行的变压器中。 为避免打印任何方法的运行时我们将建议的应用程序条件MeasureTime自定义的保留了运行时的注释MeasureTime 应用程序开发人员可以将其添加到其类中。 package sample; public class ByteBuddyTimeMeasuringAgent { public static void premain(String argument, Instrumentation instrumentation) { Advice advice Advice.to(TimeMeasurementAdvice.class); new AgentBuilder.Default() . type (ElementMatchers.isAnnotatedBy(MeasureTime.class)) .transform((DynamicType.Builder? builder, TypeDescription type , ClassLoader loader, JavaModule module) - { return builder.visit(advice.on(ElementMatchers.isMethod()); }).installOn(instrumentation); } } 给定上述代理程序的应用程序之后如果通过MeasureTime注释了一个类则现在将所有方法执行时间打印到控制台。 实际上以更结构化的方式收集此类指标当然更有意义但是在已经完成打印输出之后这不再是要完成的复杂任务。 动态代理附件和类重新定义 在Java 8之前这要归功于JDK的tools.jar中存储的实用程序该实用程序可以在JDK的安装文件夹中找到。 从Java 9开始此jar已分解到jdk.attach模块中该模块现在可在任何常规JDK发行版中使用。 使用包含的工具API可以使用以下代码将JAR文件附加到具有给定进程ID的JVM VirtualMachine vm VirtualMachine.attach(processId); try { vm.loadAgent( /location/of/agent.jar ); } finally { vm.detach(); } 当调用上述API时JVM将使用给定的ID定位进程并在该远程虚拟机内的专用线程中执行agent agentmain方法。 此外此类代理可能会要求有权在其清单中重新转换类以更改已加载的类的代码 Agentmain-Class: sample.SimpleAgent Can-Retransform-Classes: true 给定这些清单条目之后代理现在可以请求考虑将任何已加载的类进行重新转换 ClassFileTransformer可以使用附加的布尔参数来注册先前的ClassFileTransformer 从而指示需要在重新转换尝试时得到通知 package sample; public class ClassReloadingAgent { public static void agentmain(String argument, Instrumentation instrumentation) { instrumentation.addTransformer(new ClassFileTransformer() { Override public byte[] transform(Module module, ClassLoader loader, String name, Class? typeIfLoaded, ProtectionDomain domain, byte[] buffer) { if (typeIfLoaded null) { System.out.println( Class was loaded: name); } else { System.out.println( Class was re-loaded: name); } return null; } }, true ); instrumentation.retransformClasses( instrumentation.getAllLoadedClasses()); } } 为了表明已经加载了一个类现在将已加载类的实例提供给转换器对于之前未加载的类该实例为null 。 在以上示例的末尾请求仪表API获取所有已加载的类以提交任何此类类进行重新转换从而触发转换器的执行。 和以前一样出于演示工具API的目的将类文件转换器实现为不可操作。 当然Byte Buddy还通过注册重新转换策略在其API中涵盖了这种转换形式在这种情况下Byte Buddy还将考虑所有类别以便进行重新转换。 这样做可以调整以前的时间测量代理程序使其在动态连接的情况下也考虑加载的类 package sample; public class ByteBuddyTimeMeasuringRetransformingAgent { public static void agentmain(String argument, Instrumentation instrumentation) { Advice advice Advice.to(TimeMeasurementAdvice.class); new AgentBuilder.Default() .with(AgentBuilder.RetransformationStrategy.RETRANSFORMATION) .disableClassFormatChanges() . type (ElementMatchers.isAnnotatedBy(MeasureTime.class)) .transform((DynamicType.Builder? builder, TypeDescription type , ClassLoader loader, JavaModule module) - { return builder.visit(advice.on(ElementMatchers.isMethod()); }).installOn(instrumentation); } } 为了最终方便Byte Buddy还提供了一个用于附加到JVM的API该API对JVM版本和供应商进行了抽象以使附加过程尽可能地简单。 给定一个进程IDByte Buddy可以通过执行一行代码将代理附加到JVM ByteBuddyAgent.attach(processId, /location/of/agent.jar ); 此外甚至可以将当前正在运行的同一虚拟机进程附加到测试代理程序时特别方便的进程 Instrumentation instrumentation ByteBuddyAgent. install (); 此功能可以作为其自己的工件byte-buddy-agent使用 由于使用Instrumentation实例可以直接例如从一个单元中直接调用premain或agentmain方法成为可能因此自己尝试尝试自定义代理很简单。测试无需任何其他设置。 翻译自: https://www.javacodegeeks.com/2019/12/a-beginners-guide-to-java-agents.html
http://wiki.neutronadmin.com/news/277512/

相关文章:

  • 滑县网站建设报价搜狗推广登录平台
  • 网站备案申请流程低价网站建设哪家更好
  • 做教育的有哪些网站全网营销外包
  • 如何判断一个网站是php还是asp免费咨询制度
  • 大足区城乡建设投资集团网站软件项目管理计划
  • 光泽网站建设wordpress文章加颜色
  • 西安网站建设畅网个人简历表格电子版下载
  • app网站开发多少钱中移建设 网站
  • 湘潭网站建设定制磐石网络网站的验证码是怎么做的
  • 喊别人做的网站不肯给代码岳阳网站项目建设报道
  • 网站免费推广物流网络图
  • 厦门建公司网站今天最新新闻报道
  • 做外贸卖小商品是哪个网站南宁网站设计平台
  • 网站运营与管理实训报告美观网站建设物美价廉
  • 公众号里的网站怎么做的网页视频提取
  • 免费的行情网站ifind是网页制作的基本知识
  • 宁波网站建设招商加盟网站颜色正确搭配实例
  • 河北建设网站公司软件开发都有哪些项目
  • 信邦建设工程有限公司网站专业零基础网站建设教学
  • 上海网站制作顾wordpress导航文件夹
  • 地方文明网站建设网站上传文件夹
  • 保护环境做网站素材那些网站可以做0首付分期手机
  • 做it的兼职网站有哪些权重2的网站
  • 无锡制作网站公司小程序源码分享
  • 没有网站可以做哪些互联网广告推广校园网页设计模板简单
  • 写着网站建设图片微信小程序短链接生成
  • 成都科技网站建设费用建立视觉健康档案的主要意义在于
  • 手表大全网站网站开发所需开发环境
  • 中山 家居 骏域网站建设专家中山网页设计
  • 哪个网站可以做行程攻略电子商务网站建设的体会