我用的是字节好友maven插件。我需要遍历构造函数和方法代码,并在“getfield”和“putfield”指令之前收集有关字节码指令的信息。我怎么能这么做?我知道MemberSubstitution,但我需要用字段名调用实用程序类的静态方法。这是我的代码:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in t
我想装饰现有的对象,以便自动验证方法调用。我已经成功地将方法调用委托给一个调用Hibernate验证器的拦截器,到目前为止,它工作得很好:
public class HibernateBeanValidator implements BeanValidator{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
@Override
public <T> T addMethodValidation(T object) {
ExecutableValid
我正在尝试将一个AspectJ项目迁移到一个Buddy插件,并且遇到了一些困难。我想做编译时字节码的修改。
我得到的例外是:
[ERROR] Failed to execute goal net.bytebuddy:byte-buddy-maven-plugin:1.11.0:transform (default) on project timing-example: Failed to transform class files in /tmp/timing-example/target/classes: protected void com.walterjwhite.examples.ti
我正在尝试将Cglib代理转换为ByteBuddy。Cglib有接口来拦截所有的方法调用。我检查了ByteBuddy的文档,但找不到这样的例子。对于我用ByteBuddy实例化的每个对象,如果没有这样的接口,我将再次重复相同的内容。有什么更好的方法可以用ByteBuddy来实现呢?
下面是我的示例代码片段:
服务:
public class MyService {
public void sayFoo() {
System.out.println("foo");
}
public void sayBar() {
Sys
我有一个场景,我需要从未知的源加载类并实例化它们以进行模拟--我不需要运行代码,但是方法和属性必须在结果实例中。我还需要保持类名不变,因此可以将它的实例分配给其他类型已经加载的类中的字段。有时类实例化由于ExceptionInInitializerError而失败,使类处于无法恢复的无效状态。我不知道哪门课会事先不及格。
考虑到这一点:
class A {
static {
// Throws exception, resulting in 'A' changing to an error state
}
}
class B {
使用ByteBuddy,我可以通过调用另一个实例并转换结果来实现一个实例方法吗?
例如(玩具例子):
public abstract class Foo {
public String bar() {
return "bar";
}
public abstract int baz();
}
鉴于以上所述,我能否实现baz,使其调用bar()并返回返回字符串的长度?也就是说,好像是:
public int baz() {
return bar().length();
}
天真地,我尝试了以下几点:
Method bar = Foo.class.getDe
我正在实现一个代理,它使装入的类隐式地实现一个接口。由代理实现的接口中的方法以自定义方式调用用特殊注释标记的原始类方法。但事实证明,在AgentBuilder.Transformer中,加载的类仍然不存在。但是,拦截器中的代码是在类实际装入之后执行的。因此拦截器中的代码可以与类方法一起工作。我可以使用MethodDescription对象调用这些方法吗? public class CustomTransformer implements AgentBuilder.Transformer {
public static class InstantiateInterceptor {
我在获得一个与Buddy一起工作的简单示例时遇到了问题,下面是我的代码:
import static java.util.Arrays.asList;
import java.util.stream.Stream;
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.implementation.MethodDelegation;
public class Foo {
public static class Bar {
用例是实现脏字段跟踪器。为此,我有一个接口:
public interface Dirtyable {
String ID = "dirty";
Set<String> getDirty();
static <T> T wrap(final T delegate) {
return DirtyableInterceptor.wrap(delegate, ReflectionUtils::getPropertyName);
}
static <T> T wrap(final T d
我正在检查是否可以使用ByteBuddy用更小、更优雅的解决方案替换一些笨重的ASM代码。一部分是“包装”本机方法,这意味着在类中添加任何现有的本机方法的前缀,并提供一个新的、具有相同名称和签名的非本机方法来调用前缀的方法。所有这些都可能在构建时发生,所以我不需要任何代理,也不需要担心潜在的类模式更改等
从文档中看,这似乎是一个rebasing案例,其中ByteBuddy保留了原始方法的副本,并提供了通过@SuperCall调用它的可能性。
除了不能影响原始方法的新名称(它们需要有前缀,而不是后缀)之外,以下代码还会导致以下错误:
new ByteBuddy()
我们有一个模糊处理的类,我们需要用bytebuddy来增强它。我们基本上需要重新定义一个方法。子类化似乎没有起作用(代码没有执行)。Rebasing可以工作,但在我们截取的方法中,我们需要调用超类(现在使用“继承”中的超类)方法。
class Parent {
public void connect(){
...
};
}
class WeNeedToHackThis extends Parent {
public void connect(InetAddress addr){
//... this is what we want to hack
我用这种方式定义了我的建议:
public class MyInterceptor {
@Advice.OnMethodExit
public static void intercept(@Advice.Return String value) {
// do my changes
}
}
这是我要重新定义的类:
public class MyClass {
private String field;
public MyClass() {
}
public String getField() {
re
我有一个premain(),其中所有带有某个注释的方法都应该委托给某个类。一般来说,我看起来是这样的:
public static void premain( final String agentArguments, final Instrumentation instrumentation ) {
CountingInterception ci = new CountingInterception();
new AgentBuilder.Default()
.type(ElementMatchers.isAnnotatedWith(com.codahale.metrics
这个问题与我以前的问题有关:
我正在创建一个子类,它首先在将方法调用委托给某个实例之前设置一些上下文。这已经很好地解决了一个问题。
加载动态创建的子类时会出现以下错误。
java.lang.VerifyError: Bad access to protected data in invokevirtual
Exception Details:
Location:
com/frequentis/ps/service/test/saga/ProxyTestSaga$ByteBuddy$Rm8DV3Lj.setTimeoutManager(Lcom/codebullets/sag