On Apr 26, 2006, at 12:58 PM, Daniel Serodio wrote:

Sorry to rehash this subject, but apparently my previous post didn't
make it.

Euxx suggested a "safe" approach to discover the calling class:

public class ClassLocator extends SecurityManager {
  public static Class getCallerClass() {
    return new ClassLocator().getClassContext()[2];
  }
}

Quoting from [1]:

protected Class[] getClassContext()

Returns the current execution stack as an array of classes.

The length of the array is the number of methods on the execution stack.
The element at index 0 is the class of the currently executing method,
the element at index 1 is the class of that method's caller, and so on.

[1]
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ SecurityManager.html#getClassContext()


I'd be reluctant to add Logger.getLogger() regardless of the safety code used to determine the calling location. It masks the substantial amount of additional complexity necessary to introspect to determine the current calling location and only offers a tiny benefit in source code reduction. Having one variant of a method take substantially longer than another introduces an undesirable "surprise" that can catch developers.

Also, it tends to reinforce the notion that logger name must equal class name which pops up when people try to create a new Level to do what logger name is intended to do.

I would not be opposed to putting something in the sandbox that implements a class factory using the approach, something like:

public class ClassLogger {
     private ClassLogger() {
     }

    public static Logger getLogger() {
        ...
    }
}

Then if you really wanted to do the zero-arg getLogger, your code would look something like:

class MyApp {
      Logger logger = ClassLogger.getLogger();

}




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to