aspect Check { java.util.HashMap map=new java.util.HashMap(); java.util.HashMap map2=new java.util.HashMap(); java.util.HashMap global = new java.util.HashMap(); java.util.Stack method_args = new java.util.Stack(); pointcut callsite(Object caller,Object callee): this(caller) && target(callee) && call(* *(..)) && !within(Check); pointcut inmethodbody(Object a): this(a) && withincode(* *.*(..)) && !within(Check) && call(*.new(..)); after() returning (Object o): get(static * *.*) && !within(Check) { global.put(o,null); } before(Object a,Object b): set(* *.*) && args(b) && this(a) && !within(Check) { if(!map.containsKey(a)) map.put(a,new java.util.Vector()); java.util.Vector v = (java.util.Vector)map.get(a); v.add(b); } after(Object o) returning(Object a): inmethodbody(o) { if(!map2.containsKey(o)) map2.put(o,new java.util.Vector()); java.util.Vector v = (java.util.Vector)map2.get(o); v.add(a); } before(): execution(* *.*(..)) { method_args.push(thisJoinPoint.getArgs()); } after(): execution(* *.*(..)) { method_args.pop(); } after(Object caller,Object callee): callsite(caller,callee) { if(caller==callee || global.containsKey(callee)) return; Object[] arguments = (Object[])method_args.peek(); for(int i=0; i< arguments.length; i++) { if(callee==arguments[i]) return; } if(map.containsKey(caller)) { java.util.Vector v = (java.util.Vector)map.get(caller); for(int i=0;i