KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > tests > jfun > models > InjectingDecorator


1 package tests.jfun.models;
2
3 import java.lang.reflect.InvocationHandler JavaDoc;
4 import java.lang.reflect.Method JavaDoc;
5 import java.lang.reflect.Proxy JavaDoc;
6
7 public class InjectingDecorator implements InvocationHandler JavaDoc{
8   private final Injector injector;
9   private final Class JavaDoc target_type;
10   private final Object JavaDoc self;
11   
12   private InjectingDecorator(Object JavaDoc self, Class JavaDoc target_type, Injector injector) {
13     this.injector = injector;
14     this.self = self;
15     this.target_type = target_type;
16   }
17   public Object JavaDoc invoke(Object JavaDoc proxy, Method JavaDoc mtd, Object JavaDoc[] args)
18   throws Throwable JavaDoc {
19     if(Object JavaDoc.class.equals(mtd.getDeclaringClass())){
20       return mtd.invoke(this, args);
21     }
22     else{
23       final Object JavaDoc r = mtd.invoke(self, args);
24       if(target_type.isInstance(r)){
25         //the type to inject.
26
injector.inject(r);
27       }
28       return r;
29     }
30   }
31   public boolean equals(Object JavaDoc obj) {
32     if(obj == null) return false;
33     if(Proxy.isProxyClass(obj.getClass())){
34       obj = Proxy.getInvocationHandler(obj);
35     }
36     if(obj instanceof InjectingDecorator){
37       final InjectingDecorator other = (InjectingDecorator)obj;
38       return self.equals(other.self);
39     }
40     else return self.equals(obj);
41   }
42   public int hashCode() {
43     return self.hashCode();
44   }
45   public String JavaDoc toString() {
46     return self.toString();
47   }
48   public static Object JavaDoc getInjectingDecorator(ClassLoader JavaDoc cloader, Class JavaDoc[] itfs,
49       Object JavaDoc self, Class JavaDoc injectee_type, Injector injector){
50     return Proxy.newProxyInstance(cloader, itfs,
51         new InjectingDecorator(self, injectee_type, injector));
52   }
53   public static Object JavaDoc getInjectingDecorator(ClassLoader JavaDoc cloader, Class JavaDoc itf,
54       Object JavaDoc self, Class JavaDoc injectee_type, Injector injector){
55     return getInjectingDecorator(cloader, new Class JavaDoc[]{itf}, self, injectee_type, injector);
56   }
57   public static Object JavaDoc getInjectingDecorator(Class JavaDoc itf, Object JavaDoc self, Class JavaDoc injectee_type, Injector injector){
58     return getInjectingDecorator(injectee_type.getClassLoader(), itf, self, injectee_type, injector);
59   }
60   public static Object JavaDoc getInjectingDecorator(Object JavaDoc self, Class JavaDoc injectee_type, Injector injector){
61     final Class JavaDoc[] itfs = self.getClass().getInterfaces();
62     return getInjectingDecorator(injectee_type.getClassLoader(), itfs,
63         self, injectee_type, injector);
64   }
65 }
66
Popular Tags