--- /dev/null
+package test;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+
+public class Main {
+ public static void main(String[] args) {
+ new Main().foo();
+ }
+
+ @PerformenceMonitor(expected=1000)
+ public void foo() {
+
+ }
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@interface PerformenceMonitor {
+ public int expected();
+}
+
+@Aspect
+class Monitor {
+ @Pointcut("execution(@PerformenceMonitor * *(..)) && @annotation(monitoringAnnot)")
+ public void monitored(PerformenceMonitor monitoringAnnot) {}
+
+ @Around("monitored(monitoringAnnot)")
+ public Object flagExpectationMismatch(ProceedingJoinPoint pjp, PerformenceMonitor monitoringAnnot) {
+ long start = System.nanoTime();
+ Object ret = pjp.proceed();
+ long end = System.nanoTime();
+
+ if(end - start > monitoringAnnot.expected()) {
+ System.out.println("Method " + pjp.getSignature().toShortString() + " took longer than expected\n\t"
+ + "Max expected = " + monitoringAnnot.expected() + ", actual = " + (end-start));
+ }
+ return ret;
+ }
+
+}
--- /dev/null
+package test;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+
+public class Main {
+ public static void main(String[] args) {
+ new Main().foo();
+ }
+
+ @PerformenceMonitor(expected=1000)
+ public void foo() {
+
+ }
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+@interface PerformenceMonitor {
+ public int expected();
+}
+
--- /dev/null
+package test;
+
+import org.aspectj.lang.annotation.*;
+
+@Aspect
+class Monitor {
+ @Pointcut("execution(@PerformenceMonitor * *(..)) && @annotation(monitoringAnnot)")
+ public void monitored(PerformenceMonitor monitoringAnnot) {}
+
+ @Around("monitored(monitoringAnnot)")
+ public Object flagExpectationMismatch(ProceedingJoinPoint pjp, PerformenceMonitor monitoringAnnot) {
+ long start = System.nanoTime();
+ Object ret = pjp.proceed();
+ long end = System.nanoTime();
+
+ if(end - start > monitoringAnnot.expected()) {
+ System.out.println("Method " + pjp.getSignature().toShortString() + " took longer than expected\n\t" +
+"Max expected = " + monitoringAnnot.expected() + ", actual = " + (end-start));
+ }
+ return ret;
+ }
+
+}