- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经使用 CGLIB 的 Enhancer 一段时间了,但正在考虑切换到 Byte Buddy。这是非常基本的东西,代理多达数百个数据访问接口(interface),按需创建。
Enhancer enhancer = new Enhancer();
enhancer.setClassLoader(...);
enhancer.setSuperclass(...);
enhancer.setInterfaces(...);
enhancer.setCallback(...);
enhancer.create();
CGLIB 正在缓存生成的类型以提高性能。 Byte Buddy 推荐的方法是什么?我想避免任何 PermGen 问题。
最佳答案
更新:从 1.6 版开始,Byte Buddy 提供了 TypeCache
类,该类使用软引用或弱引用作为蓝图来编写带有自定义键的缓存。此缓存包含回调方法 findOrInsert
,允许按需创建类型。
使用 Byte Buddy,您应该编写自己的缓存,因为您最了解:
cglib 以带有同步映射的静态字段形式保留内部缓存,但存在一些严重的局限性。有了这个缓存,在使用缓存查询任何 Enhancer
实例时,不再由您来决定类的身份。此外,静态字段需要跟踪创建类的参数,例如输入回调的标识,这可能非常繁重。 (实际上是自己造成内存泄漏。)
Byte Buddy 希望成为一个用于生成任何 Java 类的 API,而不仅仅是用于创建代理。因此,您应该最清楚哪种缓存是有意义的。考虑您只想代理一个实例的场景。编写一个简单的门面,例如:
class MyProxyGenerator {
static Map<Class<?>, Class<?>> proxies = new HashMap<>();
public Class<?> makeProxy(Class<?> type) {
if(proxies.contains(type)) {
return proxies.get(type);
} else {
Class<?> proxy = doMakeProxy(type);
proxies.put(type, proxy);
return proxy;
}
}
private Class<?> doMakeProxy(Class<?> type) {
// use Byte Buddy here.
}
}
这里的优点是你只需要跟踪输入类作为缓存引用,如果你的应用程序是单线程的,你可以避免同步。此外,如果这样更适合您的用例,您可以将缓存定义为非静态的。甚至更好:您可以使用真正的缓存实现。这样,每个图书馆都可以做它最擅长的事情。 Byte Buddy 可以创建类,缓存也可以缓存。
为了全面披露,我是 Byte Buddy 的作者,在使用 cglib 和 javassist 一段时间后我决定采用这种方法。我在他们的缓存中遇到了几个问题,这就是为什么我决定不为 Byte Buddy 提供这样的缓存。我相信这更像是 JDK 代理的隐式缓存引入的约定,但由于上述原因,我不认为这些缓存通常是个好主意。
关于java - 在 Byte Buddy 中缓存生成的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23732236/
在使用指南阅读和理解 linux 内核时- http://www.johnchukwuma.com/training/UnderstandingTheLinuxKernel3rdEdition.pdf
我们正在尝试这种叫做:buddy.works的服务,以取代我们的jenkins管道,用于较小的项目。它提供了用于创建管道的gui,但是我们在访问子目录时遇到了问题。 Resolving host 52
我正在尝试为 springboot 应用程序构建自定义代理。这就是我的代理 premain 的样子 .with(new AgentBuilder.Initializat
我正在尝试使用 Byte Buddy 生成一个非常简单的代码. 我有一个 POJO 类,其中一些字段用 @SecureAttribute 注释,对于这些字段,我想重写 getter 实现并将调用重定向
我已经阅读并理解了二进制伙伴内存分配方法背后的概念,并且我正在尝试将其应用到 C 语言中,但在真正开始之前,我有一些特定于实现的问题。 https://drive.google.com/file/d/
我正在尝试围绕某些类图中的类生成运行时包装器,但我不知道当图中存在循环时如何处理这种情况。想象一下,有一个类 A 有一个类型 B 的字段,但类型 B 有一个类型 A 的字段。我想生成类 A' 和 B'
我看到术语“Buddy 类”被用作“如何向另一个文件中的部分类添加注释”等问题的“答案”,但这些答案假设我知道 Buddy 类 是什么,并且代码示例假设我理解这是如何工作的/为什么工作。 对于 C#
假设我有一个方法m: public void m() { String foo = "foo"; int bar = 0; doSomething(foo, bar); } 我想使用 By
我正在尝试解决人才伙伴的这个问题。 http://www.talentbuddy.co/challenge/52a9121cc8a6c2dc91481f8d5233cc274af0110af382f4
我正在尝试生成具有循环类依赖性的类,类似于这个问题:Byte Buddy - Handling cyclic references in generated classes 作为一个最小的例子,我想生
有必要描述一下这个类的结构 class A{ private List listA; } 尝试了解决方案:Byte-buddy: generate classes with cyclic
我正在尝试实例化一个没有空参数构造函数的类(而且它的直接父类也没有空参数构造函数) Class newClass = new ByteBuddy(); .subclass(Bu
即使我提供了实际的实例,Byte Buddy 似乎也只喜欢将公共(public)类作为拦截器实现;我经常发现自己想做这样的事情: import static MethodDelegation.to;
我正在尝试使用反射来检查给定类的属性是否设置了 ReadOnly 属性。我使用的类是 MVC View 模型(使用部分“伙伴”类作为元数据。 public partial class Account
我正在尝试使用 Java 代理向类添加方法。但它给出了如下错误。 java.lang.VerifyError: Local variable table overflow Exception Deta
是否可以使用 bytebuddy 创建一个全新的类和方法? 我看到的所有示例都使用现有类或拦截现有方法来修改它们。 是否有通过bytebuddy构造一个类并动态添加一些方法并返回该类的实例的示例? 最
几天来我一直在寻找“如何在运行时向方法添加注释”的答案,并找到了这个名为 Byte Buddy 的很棒的工具,使用了它,但仍然无法按我的需要使其工作到。我确定它必须能够从这个问题中做到这一点 Can
我正在尝试使用 ByteBuddy 实现 Profiler。我目前正在努力有效地为我正在分析的方法创建适当的签名。 这是我当前实现的要点:https://gist.github.com/felixba
我正在尝试使用 Byte Buddy 设置一个类,该类实现给定实例的所有接口(interface)并将所有调用转发给该实例,这是我目前的代码: import static net.bytebuddy.
我是 Byte Buddy 的新手,我正在尝试使用它来创建对对象执行 getter 方法的接口(interface)的实现。我的界面如下所示: public interface Executor {
我是一名优秀的程序员,十分优秀!