package test3;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

public class AnnotationedLoader extends ClassLoader{

	
	protected synchronized Class< ? > loadClass(String name, boolean resolve)
			throws ClassNotFoundException {
	
		Class original = super.loadClass(name, resolve);
		
		if(name.startsWith("java.")){
			return original;
		}

		try{
			ClassPool pool = ClassPool.getDefault();
	        CtClass cc = pool.get(name); 
	        
	        Method[] methods = original.getMethods();
	        for(int i=0; i<methods.length; i++){
	        	Method method = methods[i];
	        	Annotation[] annotations = method.getAnnotations();
	        	for(int j=0; j<annotations.length; j++){
	        		Annotation annotation = annotations[j];
	        		if(annotation.annotationType() == Log.class){
	        	        CtMethod ctMethod = cc.getDeclaredMethod(method.getName());
	        	        ctMethod.insertBefore("System.out.println(\"before\");");
	        		}else{
	        			//...
	        		}
	        	}
	        }
	        
	        Class clazz = cc.toClass();
	        return clazz;
	        
		}catch(Exception e){
			e.printStackTrace();
			throw new ClassNotFoundException();
		}
	}
}

