想深入学习一个字节码框架，听说了javassit、asm、ByteBuddy、cglib啥的，小傅哥帮忙大概介绍下，想入手ByteBuddy咋样。

框架介绍：

1. ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件，也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里，这些类文件拥有足够的元数据来解析类中的所有元素：类名称、方法、属性以及 Java 字节码（指令）。ASM 从类文件中读入信息后，能够改变类行为，分析类信息，甚至能够根据用户要求生成新类。

2. Javassist 是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba （千叶 滋）所创建的。它已加入了开放源代码JBoss 应用服务器项目，通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。

3. Byte Buddy 是一个代码生成和操作库，用于在 Java 应用程序运行时创建和修改 Java 类，而无需编译器的帮助。除了 Java 类库附带的代码生成实用程序外，Byte Buddy 还允许创建任意类，并且不限于实现用于创建运行时代理的接口。此外，Byte Buddy 提供了一种方便的 API，可以使用 Java 代理或在构建过程中手动更改类。2015年10月，Byte Buddy被 Oracle 授予了 Duke’s Choice大奖。该奖项对Byte Buddy的“ Java技术方面的巨大创新 ”表示赞赏。我们为获得此奖项感到非常荣幸，并感谢所有帮助Byte Buddy取得成功的用户以及其他所有人。我们真的很感激！

使用总结：

1. ASM 纯字节码操作，可以结合 IDEA 插件：ASM Bytecode Outline，进行使用。它能把你的普通 Java 代码转换为使用 ASM 操作时，应该做如何的处理。但 ASM 是使用上最复杂也是功能最强的框架，很多其他框架Cglib、Javassist、Byte-buddy 都是基于 ASM 开发的。

2. Javaassit 市面上很多基于 javaagent 实现的非入侵的全链路监控都是使用的此框架完成，因为它的性能稳定，操作简单，功能丰富，既可以使用提供的 API 也可以操作字节码，所以使用起来会更加方便，遇到问题也可以很快的找到解决方案。

3. Byte Buddy 我是非常喜欢这个框架，因为他可以让对字节码的操作简化为像写普通的程序代码一样，非常容易完成一些需求逻辑的实现，并且它还是一个获奖项目！

最后说明：

其实你可以把几款字节码插桩组件都了解下，完成同一个复杂场景的功能，看看各自的实现是否能满足你的需要，之后选取那个最合适你的。


---


小傅哥你好，我想问一下组件类以聚合工程方式引入还是以自定义start方式引入更好呢，个人感觉以jar包方式总改版本号好麻烦啊

1. 通常我们会把非业务逻辑的共性通用问题，抽取成独立的服务开发成各个领域的技术模块，这类的通常会采用中间件的方式开发。如果是Spring直接开发就行了，SpringBoot 则包装成 Starter。
2. 如果是一些项目中用到的需求逻辑，不具备共性问题的提取，本身就是属于项目的一部分，直接以项目模块 Module 的方式聚合即可，这样引入起来也方便，更符合开发使用。

---

小傅哥，程序员应该有一个副业嘛？
时常焦虑，看到一些优秀的程序员 去做小程序，外卖引流，知乎好物 部分做的好的收益都不错，自己本身没有稳定收入副业。 所以被弄得很焦虑。想向傅哥请教一下 如何去分配这个时间，对抗焦虑

提个背景：上大学的时候，很多同学放假了喜欢去做一些兼职、发发传单、洗洗盘子、当当家教，但其实我并不会支持去做这些，因为所有的此类事情与你的自身长期价值积累并不符，只能带来一点社会体验和分支经历。如果你能把这个时间放在属于你未来想做的事上，积累此类知识、经验、阅历，那么将来会给你带来更大的价值，所以我更推荐做长期有价值的事。

关于副业：其实我一直折腾此类事情，包括之前说的接私活、当网课老师、给人家做网站、还有猪八戒网的需求，折腾过后感觉这类内容的副业，需要你有一个稳定且并不小的时间投入，能赚到一点钱，但不太可能长久，因为毕竟目前你仍然需要以工作为主，在一个能满足你成长的土壤中，不断的加强自己的能力。比如你在职场的职位、收入、人脉，这些可能更是你现阶段的目标，不同的人在不同的阶段有不同的选择，但目前对你来说，搞副业，最好只当练手，提升额外的能力，先不要把赚钱看的太重，并从这些折腾的过程中，找到符合自己想做的事情。

拒绝焦虑：向阳而生、逐光而行，减少没必要的内心焦虑，你做的任何一件事将来都会汇聚在一起，慢慢铺自己的地基，不要着急于快。在时间分配上，也不要想着什么都做，人的精力也是有限的，不要给自己压榨的太狠，适当的放松非常有必要。千万记得要慢下来、慢下来、慢下来！

---

用了 spring security  ，如果有权限的动态刷新，不想引入缓存这类东西，也不用主动推送，有没有什么好的办法解决已登陆用户的权限修改？

首先：你的场景是有什么限定吗，权限使用过程中的校验可以直接读库不，因为我感觉你这个体量并不大，如果可以读库验证，直接修改库就可以了。

通常：一个权限的变更，需要走审批流程并要求用户退出登录，验证身份，才可以使用新的权限职责，避免因为权限范围扩大，导致之前账号借用等操作风险的发生(不过这个依赖于不同场景的风险级别而决定设计)。

---

如何通过javaagent方式实现http服务之间的header信息传递？Hystrix线程隔离策略或者多线程下如何实现呢？

1. 基于字节码框架(ASM、Byte-buddy、javassit)插桩和 Javaagent 能力实现的非入侵全链路监控系统，具备的特质包括：
1.1 低侵入性：监控系统应尽可能减少对业务系统的侵入，保持对使用方的透明性，减少开发人员的负担，降低接入门槛和难度。
1.2 低性能影响：由于全链路监控系统需要对各种应用中间件进行日志数据采集，大多都需要在业务系统内进行“埋点”或放置agent，一般都是在核心业务流程。因此应尽可能降低对业务系统造成的性能影响，一般来说，对CPU的耗用低于1%~2%可以作为一个参考阈值。
1.3 灵活全面的接入策略：为了尽可能降低接入成本，应该提供灵活的监控配置策略包括配置在服务器端方便升级，让业务方决定是否接入，以及收集数据的范围和粒度，并提供对应的技术方案保障监控策略生效。
1.4 时效性：实时有效的监控数据展示功能，帮助相关人员理解系统行为，为流程、架构、代码优化，以及扩容缩容、服务限流降级提供正确客观的数据参考。

2. 所有基于此类技术实现的监控系统，都需要给一次调用生成唯一ID，并在 http3x、http4x 中使用 setRequestHeader 方式进行传递。另外在 RPC 框架中如 Dubbo 也会有透传信息的字段，给予监控系统使用。

3. 关于全链路监控的学习，可以参考以下内容：
3.1 pinpoint：https://github.com/pinpoint-apm/pinpoint
3.2 bee-apm：https://github.com/itstack-org/bee-apm
