मैं वर्तमान में कुछ मौजूदा जेएक्स/आरएस संसाधनों को प्रॉक्सी करने की कोशिश कर रहा हूं ताकि मुझे हाइबरनेट वैलिडेटर के विधि सत्यापन समर्थन का उपयोग करने की अनुमति मिल सके। हालांकि, जब मैं अपनी कक्षा को प्रॉक्सी करता हूं (वर्तमान में cglib 2.2 का उपयोग कर रहा हूं), फॉर्मपैम एनोटेशन प्रॉक्सी क्लास में पैरामीटर पर मौजूद नहीं है, और इसलिए जेएक्स/आरएस रनटाइम (अपाचे विंक) पैरामीटर को पॉप्युलेट नहीं कर रहा है।मैं जावा में गतिशील प्रॉक्सी कैसे बना सकता हूं जो विधियों पर पैरामीटर एनोटेशन बनाए रखता है?
no proxy for Class: ProxyTester$ProxyMe Method: aMethod has 1 parameters Param 0 has 1 annotations Annotation @ProxyTester.TestAnnotation() javassist proxy for Class: ProxyTester$ProxyMe Method: aMethod has 1 parameters Param 0 has 0 annotations cglib proxy for Class: ProxyTester$ProxyMe Method: aMethod has 1 parameters Param 0 has 0 annotations jdk proxy for Class: ProxyTester$ProxyMe Method: aMethod has 1 parameters Param 0 has 0 annotations
क्या कोई अन्य विकल्प हैं:
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import javassist.util.proxy.ProxyFactory;
public class ProxyTester {
@Target({ PARAMETER })
@Retention(RUNTIME)
public static @interface TestAnnotation {
}
public static interface IProxyMe {
void aMethod(@TestAnnotation int param);
}
public static class ProxyMe implements IProxyMe {
public void aMethod(@TestAnnotation int param) {
}
}
static void dumpAnnotations(String type, Object proxy, Object forObject,
String forMethod) {
String className = forObject.getClass().getName();
System.err.println(type + " proxy for Class: " + className);
for (Method method : proxy.getClass().getMethods()) {
if (method.getName().equals(forMethod)) {
final int paramCount = method.getParameterTypes().length;
System.err.println(" Method: " + method.getName() + " has "
+ paramCount + " parameters");
int i = 0;
for (Annotation[] paramAnnotations : method
.getParameterAnnotations()) {
System.err.println(" Param " + (i++) + " has "
+ paramAnnotations.length + " annotations");
for (Annotation annotation : paramAnnotations) {
System.err.println(" Annotation "
+ annotation.toString());
}
}
}
}
}
static Object javassistProxy(IProxyMe in) throws Exception {
ProxyFactory pf = new ProxyFactory();
pf.setSuperclass(in.getClass());
Class c = pf.createClass();
return c.newInstance();
}
static Object cglibProxy(IProxyMe in) throws Exception {
Object p2 = Enhancer.create(in.getClass(), in.getClass()
.getInterfaces(), new MethodInterceptor() {
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
return arg3.invokeSuper(arg0, arg2);
}
});
return p2;
}
static Object jdkProxy(final IProxyMe in) throws Exception {
return java.lang.reflect.Proxy.newProxyInstance(in.getClass()
.getClassLoader(), in.getClass().getInterfaces(),
new InvocationHandler() {
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
return method.invoke(in, args);
}
});
}
public static void main(String[] args) throws Exception {
IProxyMe proxyMe = new ProxyMe();
dumpAnnotations("no", proxyMe, proxyMe, "aMethod");
dumpAnnotations("javassist", javassistProxy(proxyMe), proxyMe,
"aMethod");
dumpAnnotations("cglib", cglibProxy(proxyMe), proxyMe, "aMethod");
dumpAnnotations("jdk", jdkProxy(proxyMe), proxyMe, "aMethod");
}
}
यह मैं निम्नलिखित उत्पादन देता है: यहाँ कुछ परीक्षण कोड है कि इस से पता चलता है?
मैंने जावा प्रॉक्सी के साथ यह कोशिश की, लेकिन विशेष रूप से इसे cglib के लिए प्रयास नहीं किया। मैं इसे आज़माउंगा और देख सकता हूं कि यह कुछ भी बदलता है या नहीं। मुझे कहना है कि मैं आशावादी नहीं हूं, हालांकि। –
मैंने इसका कोई फायदा नहीं लिया :-( –
क्या आप कोशिश कर सकते हैं कि यह वसंत वैधता इंटरफ़ेस के साथ काम करता है? तो कक्षा से एनोटेशन हटाएं, इंटरफ़ेस को कार्यान्वित करें और इसे वैधकर्ता में डाल दें? –