1 package com.tirsen.nanning.locking; 2 3 import com.tirsen.nanning.config.Aspect; 4 import com.tirsen.nanning.AspectInstance; 5 import com.tirsen.nanning.MixinInstance; 6 import com.tirsen.nanning.AspectException; 7 8 import java.util.Arrays ; 9 10 15 public abstract class SimpleMixinAspect implements Aspect, Cloneable { 16 private Class interfaceClass; 17 18 22 public SimpleMixinAspect() { 23 setInterfaceClass(determineInterfaceClass(this.getClass())); 24 } 25 26 private Class determineInterfaceClass(Class targetClass) { 27 Class [] interfaces = targetClass.getInterfaces(); 28 while (targetClass.getInterfaces().length == 0) { 29 targetClass = targetClass.getSuperclass(); 30 interfaces = targetClass.getInterfaces(); 31 } 32 assert targetClass != SimpleMixinAspect.class && interfaces.length == 1 : 33 "your aspects class " + targetClass + " does not implement exactly one interface " + Arrays.asList(interfaces) + 34 " you have to specify the mixins interface manually using setInterfaceClass(Class)"; 35 Class interfaceClass = interfaces[0]; 36 return interfaceClass; 37 } 38 39 public SimpleMixinAspect(Class interfaceClass) { 40 setInterfaceClass(interfaceClass); 41 } 42 43 protected void setInterfaceClass(Class interfaceClass) { 44 this.interfaceClass = interfaceClass; 45 } 46 47 public void introduce(AspectInstance instance) { 48 try { 49 instance.addMixin(new MixinInstance(interfaceClass, clone())); 50 } catch (Exception e) { 51 throw new AspectException(e); 52 } 53 } 54 55 public void advise(AspectInstance aspectInstance) { 56 Object target = aspectInstance.getMixinForInterface(interfaceClass).getTarget(); 57 if (target == this) { 58 doAdvise(aspectInstance); 59 60 } else { 61 ((Aspect) target).advise(aspectInstance); 62 } 63 } 64 65 protected abstract void doAdvise(AspectInstance aspectInstance); 66 } 67 | Popular Tags |