मैं क्लाइब प्रॉक्सी को बाइटबड्डी में बदलने की कोशिश कर रहा हूं। सभी विधि कॉल को रोकने के लिए Cglib net.sf.cglib.proxy.Proxy इंटरफ़ेस है। मैं बाइटबड्डी के दस्तावेज़ीकरण की जांच करता हूं लेकिन ऐसा कोई उदाहरण नहीं मिला। बाइटबड्डी के साथ तत्काल प्रत्येक ऑब्जेक्ट के लिए इस तरह के इंटरफ़ेस के बिना मैं एक ही चीज़ दोबारा दोहरा रहा हूं और agin। बाइटबड्डी के साथ ऐसा करने का कोई बेहतर तरीका है?बाइटबड्डी प्रॉक्सी इंटरफेस
यहाँ मेरी उदाहरण कोड का टुकड़ा है:
सेवा:
public class MyService {
public void sayFoo() {
System.out.println("foo");
}
public void sayBar() {
System.out.println("bar");
}
}
इंटरसेप्टर:
public class MyServiceInterceptor {
public void sayFoo(@SuperCall Callable<Void> zuper) {
try {
zuper.call();
} catch (Exception e) {
e.printStackTrace();
}
}
public void sayBar(@SuperCall Callable<Void> zuper) {
try {
zuper.call();
} catch (Exception e) {
e.printStackTrace();
}
}
}
टेस्ट:
import net.bytebuddy.ByteBuddy;
import net.bytebuddy.ClassFileVersion;
import net.bytebuddy.dynamic.ClassLoadingStrategy;
import net.bytebuddy.instrumentation.MethodDelegation;
import net.bytebuddy.instrumentation.method.matcher.MethodMatchers;
public class Main {
public static void main(String[] args) throws Exception {
ByteBuddy buddy = new ByteBuddy(ClassFileVersion.forCurrentJavaVersion());
Class<? extends MyService> serviceClass =
buddy.subclass(MyService.class)
.method(MethodMatchers.named("sayFoo").or(MethodMatchers.named("sayBar")))
.intercept(MethodDelegation.to(new MyServiceInterceptor()))
.make()
.load(Main.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
MyService service = serviceClass.newInstance();
service.sayFoo();
service.sayBar();
}
}