@CallerSensitive as public API ?

Remi Forax forax at univ-mlv.fr
Wed Jun 26 08:34:42 UTC 2013


On 06/26/2013 03:10 AM, Dr Heinz M. Kabutz wrote:
> Hi Peter,
>
> here is another use case, where someone might want to use this:
>
> 3 - in a static context, find out what the class is that you are in.
>
> For example, if you want to create a logger, instead of doing this:
>
> private static final Logger log = Logger.getLogger(SomeClass.class);
>
> we could instead have a magic method that figures out what class this 
> is being called from and then sets the class automatically.
>
> There are two other ways to do this, but they are a lot slower than 
> Reflection.getCallerClass():
>
> 1. http://www.javaspecialists.eu/archive/Issue137.html - create an 
> exception and figure out who the calling class is
>
> 2. Or we can use the SecurityManager to get us a stack of contexts.
>
> For example, in the exercises for my courses, some students had 
> problems with the JUnit plugin.  So each test case also contains the 
> main method, but it is always the same:
>
>    public static void main(String[] args) {
>        UnitTestRunner.run();
>    }
>
> My UnitTestRunner then depends on the security manager to decide what 
> the actual class is and then uses the JUnit4TestAdapter to call the 
> methods:
>
> import junit.framework.*;
> import junit.textui.*;
>
> public class UnitTestRunner {
>    private static void run(Class clazz) {
>        System.out.println("Running unit tests for " + clazz);
>        TestRunner.run(new JUnit4TestAdapter(clazz));
>    }
>
>    public static void run() {
>        MySecurityManager sm = new MySecurityManager();
>        Class clazz = sm.getClassContext()[2];
>        run(clazz);
>    }
>
>    private static class MySecurityManager extends SecurityManager {
>        public Class[] getClassContext() {
>            return super.getClassContext();
>        }
>    }
> }
>
> Works like a charm.  Fortunately this is not affected by the 
> Reflection.getCallerClass() bug.
>
> Just my 2c :-)
>
> Regards
>
> Heinz

Hi Heinz,
You can also use the JSR 292 Lookup object
   MethodHandles.lookup().lookupClass()

cheers,
Rémi






More information about the core-libs-dev mailing list