gpt4 book ai didi

java - Byte Buddy 中的拦截器类可见性

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:30 25 4
gpt4 key购买 nike

即使我提供了实际的实例,Byte Buddy 似乎也只喜欢将公共(public)类作为拦截器实现;我经常发现自己想做这样的事情:

import static MethodDelegation.to;

new ByteBuddy().subclass(Object.class).method(any()).intercept(to(new Object() {
@RuntimeType
public Object intercept(@Origin Method m, @AllArguments Object[] a) {
return null;
}
});

然而,这会导致如下异常:

Exception in thread "main" java.lang.IllegalStateException: class net.bytebuddy.renamed.java.lang.Object$ByteBuddy$pUmdGhyP cannot access class us.levk.guice.vs.Scopes$1Builder$1

强制可见性背后有什么原因吗?

编辑:不过我还是遇到了麻烦;我遇到了一个不同的异常,这是我的代码:

package us.levk.guice.vs;

import static net.bytebuddy.implementation.MethodDelegation.to;
import static net.bytebuddy.matcher.ElementMatchers.any;

import java.lang.reflect.Method;
import java.util.function.Function;
import java.util.function.Supplier;

import net.bytebuddy.ByteBuddy;
import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.Origin;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;

public class Bar {

Function<Supplier<?>, Class<?>> wrapper () {
return s -> {
return new ByteBuddy ().subclass (Object.class)
.name (Bar.class.getPackage ().getName () + ".Foo")
.method (any ())
.intercept (to (new Object () {
@RuntimeType
public Object intercept (@Origin Method method,
@AllArguments Object[] args) {
System.out.println (method);
return null;
}
}))
.make ()
.load (getClass ().getClassLoader (),
ClassLoadingStrategy.Default.WRAPPER)
.getLoaded ();
};
}

public static void main (String[] args) throws InstantiationException, IllegalAccessException {
new Bar ().wrapper ().apply ( () -> new Integer (1)).newInstance ().toString ();
}
}

现在是异常(exception):

Exception in thread "main" java.lang.IllegalAccessError: tried to access class us.levk.guice.vs.Bar$1 from class us.levk.guice.vs.Foo

编辑2:

如果我将类加载策略更改为 INJECTION,它会工作正常

最佳答案

在这种情况下,Byte Buddy 会通知您可见性限制,该限制会在运行时导致 IllegalAccessException

即使您将方法声明为 publicjavac 也会自动将匿名类定义为包私有(private)。因此,该方法对生成的类不可见,因为 net.bytebuddy.renamed.java.lang.Object 不等于 us.levk.guice.vs.Scopes .

如果你这样做了:

new ByteBuddy().subclass(Object.class).name("us.levk.guice.vs.Foo")
.method(any()).intercept(to(new Object() {
@RuntimeType
public Object intercept(@Origin Method m, @AllArguments Object[] a) {
return null;
}
}));

一切都会好起来的。或者,您可以定义 - 例如 - 一个公共(public)接口(interface),例如:

public interface Foo {
@RuntimeType
Object intercept(@Origin Method m, @AllArguments Object[] a);
}

new ByteBuddy().subclass(Object.class).name("us.levk.guice.vs.Foo")
.method(any()).intercept(to(new Foo() {
@RuntimeType
public Object intercept(@Origin Method m, @AllArguments Object[] a) {
return null;
}
}, Foo.class));

关于java - Byte Buddy 中的拦截器类可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34756496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com