Am 20.09.2013 12:05, schrieb Peter Levart:
[...]
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.
first Caller is only going back one, or not? Not useful for us in the
cases we need this. I wouldn't say the API through getCallerClass(int)
was optimal for us, I think the new one can be better... I only miss (or
didn't get how) the ability not to have to walk the entire stack,
without knowing before how deep I have to go
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...
that is I think a usecase for some... as I said, getCallerClass(int) is
not really ideal for us either. More ideal in this style would be for us
public static <T> T findCaller(Predicate<StackFrameInfo> predicate,
Function<StackFrameInfo,T> function)
with the predicate indicating when to stop.. though the usage of this is
not that nice:
Class getCallerClass(final int nonSkippedFramesDepth) {
return findCaller(new Predicate<StackFrameInfo>() {
int depth = 0;
boolean test(StackFrameInfo info) {
if (haveToSkip(info.getDeclaringClass())) return false;
depth++;
if (depth>=nonSkippedFramesDepth) return
info.getDeclaringClass();
}
}, StackFrameInfo::getDeclaringClass());
}
Have you guys though about exposing the StackStream instead? Then you
could use all the existing JDK method for streams on that, which gives
you a much more flexible API. I could then for example change the Stream
of StackFrameInfo into one of Class.
bye Jochen
--
Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
blog: http://blackdragsview.blogspot.com/
german groovy discussion newsgroup: de.comp.lang.misc
For Groovy programming sources visit http://groovy-lang.org