public static StackTrace from(final StackTraceElement[] stackTrace, final int relevantFramesStart) { return new StackTrace(stackTrace, relevantFramesStart); }
@Test public void testSomeMethod() { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); StackTrace st = new StackTrace(stack, 1); String str = st.toString(); Assert.assertThat(str, Matchers.containsString("testSomeMethod")); Assert.assertThat(str, Matchers.not(Matchers.containsString("getStackTrace"))); } }
@AfterReturning(pointcut = "call(*.new(..))", returning = "obj", argNames = "jp,obj") public void afterAllocation(final JoinPoint jp, final Object obj) { MutableInteger counter = ThreadLocalCounter.get(); int value = counter.getValue(); if (value < SAMPLE_COUNT) { counter.setValue(value + 1); } else { // the stack trace get and the object size method are expensive to be done at every allocation... counter.setValue(0); StackTrace st = StackTrace.from(Thread.currentThread().getStackTrace(), 2); RECORDER.getRecorder(st).record(InstrumentationHelper.getObjectSize(obj)); } } }