java.lang.reflect.InvocationHandler के लिए एपीआई javadocs से:
InvocationHandler एक प्रॉक्सी उदाहरण के आह्वान के संचालक द्वारा कार्यान्वित इंटरफेस है।
गतिशील प्रॉक्सी इंटरफ़ेस लागू करता है, लेकिन विधियों के मूल कार्यान्वयन प्रदान करने के लिए हैंडलर (OriginalClass) का उपयोग करता है।
आपके सवालों के जवाब के लिए:
- संकलक आप जब तक यह निश्चित है कि कलाकारों के सफल नहीं हो सकते होने के लिए पर्याप्त जानकारी नहीं है डाली करने देगा। गतिशील प्रॉक्सी के लिए परीक्षण और उदाहरण परीक्षण के रनटाइम व्यवहार javaadoc में java.lang.reflect.Proxy के लिए वर्णित है। यदि इंटरफ़ेस के साथ उपयोग किया जाता है, तो परीक्षणों का उदाहरण और उदाहरण सफल होगा, लेकिन कक्षाओं के साथ उपयोग नहीं किया जाता है।
- आप डायनामिक प्रॉक्सी का उपयोग करके किसी भी विशेषता का उपयोग नहीं कर सकते क्योंकि यह इंटरफ़ेस लागू करता है, यह हैंडलर क्लास का विस्तार नहीं करता है।
- आप डायनामिक प्रॉक्सी का उपयोग करके इंटरफ़ेस में घोषित नहीं किए गए किसी भी तरीके तक नहीं पहुंच सकते हैं क्योंकि यह इंटरफ़ेस लागू करता है, यह हैंडलर क्लास का विस्तार नहीं करता है।
गतिशील प्रॉक्सी के कार्यान्वयन के अंदर (उदाहरण के लिए आमंत्रण के कार्यान्वयन में ...) विधि) आप प्रतिबिंब का उपयोग कर हैंडलर के सदस्यों तक पहुंच सकते हैं।
// package ...;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import junit.framework.Assert;
import org.junit.Test;
public class TestDynamicProxy
{
@Test
public void testCast() throws Exception {
Foo foo = (Foo) TestProxy.newInstance(new FooImpl());
foo.bar(null);
System.out.println("Class: " + foo.getClass());
System.out.println("Interfaces: " + foo.getClass().getInterfaces());
Assert.assertNotNull(foo);
Assert.assertTrue(foo instanceof Foo);
Assert.assertFalse(foo instanceof FooImpl);
}
}
interface Foo
{
Object bar(Object obj) throws Exception;
}
class FooImpl implements Foo
{
public Object bar(Object obj) throws Exception {
return null;
}
}
class TestProxy implements java.lang.reflect.InvocationHandler
{
private final Object obj;
public static Object newInstance(Object obj) {
return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new TestProxy(obj));
}
private TestProxy(Object obj) {
this.obj = obj;
}
public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
Object result;
try {
result = m.invoke(obj, args);
}
catch (InvocationTargetException e) {
throw e.getTargetException();
}
catch (Exception e) {
throw new RuntimeException("unexpected invocation exception: " + e.getMessage());
}
return result;
}
}
यह article उपयोगी जानकारी और उदाहरण कोड का एक बहुत कुछ है:
यहाँ कुछ परीक्षण कोड है कि मैं अपने जवाब की जांच करने के लिए प्रयोग किया जाता है।
क्या आप शर्मिंदा हैं कि आपकी प्रॉक्सी को मूल क्लास कार्यों में कास्टिंग करें? मेरी समझ में यदि आपने मूल इंटरफेस के लिए प्रॉक्सी बनाई है तो आपको OriginalClass –