我一直在OSGi应用程序中使用Buddy来实现简单的检测服务。一个包提供了一个注释,用于标记要检测的方法,以及一个从客户机包的bundle激活器中调用的方法。该调用将导致搜索客户端包的条目,以查找带有批注标记的方法的类。这些类中的每一个都被读取为字节码,并通过Advice进行增强,并使用客户机包的类加载器抢先加载。
我使用ClassLoadingStrategy.Default.INJECTION和ByteBuddy::redefine加载类。在加载任何原始类之前,需要从客户机包的包激活器调用操作,从而避免了对代理的需求。
我现在注意到关于INJECTION的评论,它说它不会从Java11继续工作。我找到了一个DZone文章,它将ClassLoadingStrategy.UsingLookup表示为新的等价物,并展示了如何在Java8到11上编译和运行代码。
UsingLookup可以和redefine一起使用吗?Lookup::defineClass不允许替换已经加载的类吗?MethodHandles::privateLookupIn时传递MethodHandles::privateLookupIn,以获得一个Lookup,然后该Lookup可用于定义和加载该包的检测类。谢谢!
发布于 2018-11-22 01:56:22
我发现在每个目标包中放置一个包info.java并加载“class”提供了一个整洁的钩子。然而,我后来了解到OSGi编织钩子,并使用它。
https://stackoverflow.com/questions/52984627
复制相似问题