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

Reply via email to