On 09/20/2013 10:58 AM, Jochen Theodorou wrote:
Am 20.09.2013 09:09, schrieb Mandy Chung:
[...]
Stack is a "stream" that allows you to walk partial stack (e.g. find
caller) or full stack trace (e.g. throwable). The filtering and mapping
operations are lazy to avoid having the VM eagerly copying the entire
stack trace data even for the short reach case (like Groovy and Log4j).
and is there a link to StackStram too?
The Thread#walkStack methods don't really describe the behaviour of
the consumer. Will the consumer applied only once, or multiple times?
If only once, then to replace getCallerClass(int depth), you will need
the version with the predicate, which will be difficult to realize
with a simple lambda, since you will need to count as well.
The use-cases described used getCallerClass(int depth) repeatedly to
find a caller by iterating over a range of depths and calling
getCallerClass(depth). You can use either Thread.walkStack or
Thread.firstCaller for implementing those use-cases.
Maybe the following method would be handy to optimize search when we
know that we want to skip 1st N frames before starting testing with
predicate:
public static <T> T firstCaller(int startDepth,
Predicate<StackFrameInfo> predicate,
Function<StackFrameInfo,T> function) {
Reflection.getCallerClass(depth)
then becomes:
Thread.firstCaller(depth, f -> true, StackFrameInfo::getDeclaringClass);
Hm...
Peter
bye Jochen