代码之家  ›  专栏  ›  技术社区  ›  FranAguiar

如何从java中的方法获取调用方类对象?

  •  2
  • FranAguiar  · 技术社区  · 6 年前

    我知道我可以从 StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 但那不是我想要的。 我想要类对象,这样我就可以访问他的接口、注释等。。。

    有可能吗? Class<?> classObject = getCallerClass();

    我看到这个问题,但那只是为了类名。

    How to get the caller class in Java

    编辑:现在我通过这门课:

    someService.dummyMethod(foo1, foo2, new Object(){}.getClass());

      someService(String foo1, int foo2, Class<?> c) {
        // stuff here to get the methodname, 
        // the interface of the class and an annotation from the interface.
    }
    

    我从许多不同的类调用某个服务,如果不可能,我将继续这样,但是如果有一种方法可以在运行时获取调用方类,我更喜欢这样。

    2 回复  |  直到 6 年前
        1
  •  6
  •   Zabuza    6 年前

    使用链接问题的代码获取类名: How to get the caller class in Java

    然后使用类名检索类,使用此处的代码: Getting class by its name

    完整代码:

    String callerName = Thread.currentThread().getStackTrace()[2].getClassName();
    
    try {
        Class<?> caller = Class.forName(callerName);
        // Do something with it ...
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    

    (社区回答,因为只有现有答案的混合)。

        2
  •  3
  •   Slaw    6 年前

    如果您使用的是Java9+,则可以使用 java.lang.StackWalker .

    public void foo() {
        Class<?> caller = StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
                .getCallerClass();
    }
    

    但是,自从 StackWalker 如果是线程安全的,那么创建一个实例并将其存储在某个地方(而不是每次调用该方法时都创建一个新实例)可能是有益的。

    Javadoc的 getCallerClass() :

    获取 Class 调用方法的调用方的 调用 getCallerClass .

    这种方法过滤反射帧, MethodHandle ,和隐藏框架 不管 SHOW_REFLECT_FRAMES SHOW_HIDDEN_FRAMES 选项 这 斯塔克沃克 已配置为。

    当存在调用方帧时,应调用此方法。如果是的话 从堆栈最底层的帧调用, IllegalCallerException 会被扔掉。

    这个方法抛出 UnsupportedOperationException 如果这个 斯塔克沃克 未配置 RETAIN_CLASS_REFERENCE 选择。