专栏首页FoamValueByte Buddy 基础知识

Byte Buddy 基础知识

Byte Buddy is a code generation and manipulation library for creating and modifying Java classes during the runtime of a Java application and without the help of a compiler. https://bytebuddy.net/#/

Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助。


举个栗子

package cn.live;

import static org.hamcrest.MatcherAssert.*;
import static org.hamcrest.core.Is.*;
import org.junit.Test;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.implementation.FixedValue;
import net.bytebuddy.matcher.ElementMatchers;

public class ByteBuddyTest {
  @Test
  public void test1() throws InstantiationException, IllegalAccessException {
    Class<?> dynamicType = new ByteBuddy()
        .subclass(Object.class)
        .method(ElementMatchers.named("toString"))
        .intercept(FixedValue.value("Hello World!"))
        .make()
        .load(ByteBuddy.class.getClassLoader())
        .getLoaded();
  
    System.out.println(dynamicType.newInstance().toString());
    assertThat(dynamicType.newInstance().toString(), is("Hello World!"));
  }
}

生成 Object 类的子类,拦截该子类的 toString() 方法,并返回固定的字符串 Hello World!。

执行结果:

Hello World!

方法详解:

  • subclass
    • 创建一个新的生成器以对提供的类型进行子类化。如果提供的类型是接口,则创建实现此接口类型的新类。
  • method
    • 匹配已由检测类型声明或继承的方法。这提供了机会来更改或覆盖该方法的实现,默认值,注释或自定义属性。也可以将方法抽象化。
  • intercept
    • 通过提供的实现来实现先前定义或匹配的方法。
  • make
    • 创建此构建器代表的动态类型。
  • load
    • 尝试加载此动态类型,包括其所有辅助类型(如果有)。
  • getLoaded
    • 返回加载的主类。

基础 API

  • subclass
    • 创建一个新的生成器以对提供的类型进行子类化。如果提供的类型是接口,则创建实现此接口类型的新类。
  • rebasing
    • 当使用rebasing方式增强一个类时,Byte Buddy 保存目标类中所有方法的实现
  • redefinition
    • 当重定义一个类时,Byte Buddy 可以对一个已有的类添加属性和方法,或删除已经存在的方法实现。如果使用其他的方法实现替换已经的方法实现,则原来存在的方法实现就会消失。
  • ClassLoadingStrategy.Default
    • WRAPPER
      • 创建一个新的 net.bytebuddy.dynamic.loading.ByteArrayClassLoader 类加载器。
    • WRAPPER_PERSISTENT
      • 与 WRAPPER,所有类可以保留为字节数组。
    • CHILD_FIRST
      • 子优先级类加载策略是 WRAPPER 修改版本,动态类型的优先级高于具有相同名称的父类加载器的任何类型。
    • CHILD_FIRST_PERSISTENT
      • 与 CHILD_FIRST,所有类可以保留为字节数组。
    • INJECTION
      • 不会创建新的类加载器,而是通过反射访问将所有类注入给定的java.lang.ClassLoader中。
  • defineMethod
    • 定义要由检测类型声明的指定方法。
  • defineField
    • 将指定的字段定义为内置动态类型的字段。
  • Implement
    • 为检测类型实现提供的接口。

总结

Byte Buddy 是一个轻量级的运行时类生成工具。生成的类不会产生字节码文件,就像它的 Logo 幽灵一样,存在于 Java 应用程序之中。

PS. 似乎,可以使用 Byte Buddy 干一些奇奇怪怪的事情哟~

本文分享自微信公众号 - FoamValue(gh_3c635269f459),作者:FoamValue

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「学习笔记」树和二叉树

    由 n(n ≧ 0)个结点组成的有序集合,n = 0 时称为空二叉树;n > 0 的二叉树是由一个根节点和两棵互不相交的、分别称为左子树和右子树的子二叉树构成。...

    FoamValue
  • 「周末福报」红黑树

    红黑树 Red-Black Tree,是只有红、黑结点并且能自平衡处理的二叉搜索树。

    FoamValue
  • 工厂模式 Factory Pattern

    Factory Pattern,是 Java 常用的设计模式之一。它提供了一种与创建逻辑无关的创建实例的能力。

    FoamValue
  • 嗯,春招两次腾讯面试都挂二面了,分享下我失败+傻傻的面试经历

    这个春招估计也要介绍了吧,自己投的公司也不多吧,投简历的时候,如果你提前批和正常网申都投的话,可能会获得两次笔试/面试的机会,我投了两次腾讯,不过,两次都在二面...

    帅地
  • 地哥的腾讯面试经历

    腾讯提前批的面试应该是一个月前就开始的,我第一个投的公司就是腾讯了,人生的第一次笔试和面试也献给了腾讯。先说下笔试吧,笔试是 5 道编程题,个人觉得,腾讯的笔试...

    Java3y
  • 嗯,春招两次腾讯面试都挂二面了,分享下我失败+傻傻的面试经历

    这个春招估计也要介绍了吧,自己投的公司也不多吧,投简历的时候,如果你提前批和正常网申都投的话,可能会获得两次笔试/面试的机会,我投了两次腾讯,不过,两次都在二面...

    乔戈里
  • 前端中的函数式编程

    vue、react这些热门的框架都多多少少有点涉及到函数式编程的领域,甚至已经开始有一些以函数式编程作为主范式的框架出现,比如说 cyclejs 。那么,为什么...

    陈柏信
  • 快速学习-Zookeeper写数据流程

    cwl_java
  • js判断方法是否存在

    似水的流年
  • 在 TS 中如何处理特殊值

    添加特殊值的一种方法是创建一个新类型,该类型是一些特殊值的基本类型的超集,这些特殊值称为哨兵。

    阿宝哥

扫码关注云+社区

领取腾讯云代金券