1 package com.tirsen.nanning.config; 2 3 import com.tirsen.nanning.AspectException; 4 import com.tirsen.nanning.AspectInstance; 5 import com.tirsen.nanning.MixinInstance; 6 7 public class FindTargetMixinAspect implements Aspect { 8 private static final String DEFAULT_IMPLEMENTATION_SUFFIX = "Impl"; 9 private String implementationSuffix = DEFAULT_IMPLEMENTATION_SUFFIX; 10 11 public FindTargetMixinAspect() { 12 this(DEFAULT_IMPLEMENTATION_SUFFIX); 13 } 14 15 public FindTargetMixinAspect(String implementationSuffix) { 16 this.implementationSuffix = implementationSuffix; 17 } 18 19 public void introduce(AspectInstance aspectInstance) { 20 if (aspectInstance.getClassIdentifier() == null) { 21 return; 22 } 23 24 if (aspectInstance.hasMixinForInterface(aspectInstance.getClassIdentifier())) { 25 return; 26 } 27 28 MixinInstance mixin = new MixinInstance(); 29 30 Class interfaceClass = aspectInstance.getClassIdentifier(); 31 Class targetClass = findImpl(interfaceClass); 32 Object target; 33 try { 34 target = targetClass.newInstance(); 35 } catch (Exception e) { 36 throw new AspectException("Could not instantiate target " + targetClass, e); 37 } 38 39 mixin.setInterfaceClass(interfaceClass); 40 mixin.setTarget(target); 41 aspectInstance.addMixin(mixin); 42 } 43 44 public void advise(AspectInstance aspectInstance) { 45 } 46 47 private Class findImpl(Class interfaceClass) { 48 Class impl = findImpl(interfaceClass, implementationSuffix); 49 assert impl != null : "could not find target for " + interfaceClass; 50 return impl; 51 } 52 53 public static Class findImpl(Class interfaceClass, String implementationSuffix) { 54 String name = interfaceClass.getName(); 55 int packageEnd = name.lastIndexOf('.'); 56 String className = name.substring(0, packageEnd) + name.substring(packageEnd) + implementationSuffix; 57 try { 58 return Class.forName(className); 59 } catch (ClassNotFoundException e) { 60 return null; 61 } 62 } 63 } 64 | Popular Tags |