1 package dynaop; 2 3 import dynaop.util.Cache; 4 import dynaop.util.Classes; 5 6 11 public class ProxyFactory { 12 13 Aspects aspects; 14 15 Cache classProxyCreators = new Cache() { 16 protected Object create(Object key) { 17 if (aspects == null) 18 return null; 19 Class parentClass = (Class ) key; 20 ProxyType proxyType = 21 aspects.createProxyType(parentClass, 22 new ProxyTypeBuilder(parentClass)); 23 return (proxyType == null) ? null : 24 new ClassProxyCreator(proxyType, parentClass); 25 } 26 }; 27 28 Cache dynamicProxyCreators = new Cache() { 29 ProxyType create(Class targetClass) { 30 if (aspects == null) 31 return null; 32 return aspects.createProxyType(targetClass, 33 new ProxyTypeBuilder(targetClass)); 34 } 35 36 protected Object create(Object key) { 37 ProxyType proxyType = create((Class ) key); 38 return (proxyType == null) ? null : 39 new DynamicProxyCreator(proxyType); 40 } 41 }; 42 43 ProxyFactory(Aspects aspects) { 44 this.aspects = new Aspects(aspects); 45 } 46 47 56 public Object wrap(Object target) { 57 DynamicProxyCreator creator = 58 (DynamicProxyCreator) dynamicProxyCreators.get(target.getClass()); 59 60 if (creator == null) 61 return target; 62 63 DynamicProxyInvocationHandler handler = 64 new DynamicProxyInvocationHandler(creator.getProxyType(), target); 65 Proxy proxy = creator.createProxy(handler); 66 handler.setProxy(proxy); 67 68 return proxy; 69 } 70 71 82 public Object extend(Class parentClass) { 83 ClassProxyCreator creator = 84 (ClassProxyCreator) classProxyCreators.get(parentClass); 85 if (creator == null) 86 return Classes.newInstance(parentClass); 87 88 ClassProxyInvocationHandler handler = 89 new ClassProxyInvocationHandler(creator.getProxyType()); 90 Proxy proxy = creator.createProxy(handler); 91 handler.setProxy(proxy); 92 93 return proxy; 94 } 95 96 99 public static ProxyFactory getInstance(Aspects aspects) { 100 return new ProxyFactory(aspects); 101 } 102 103 static ProxyFactory defaultInstance; 104 105 109 public static synchronized ProxyFactory getInstance() { 110 if (defaultInstance == null) 111 defaultInstance = getInstance(Aspects.getInstance()); 112 return defaultInstance; 113 } 114 } 115 | Popular Tags |