java方法返回类型

时间:2012-01-05 13:13:17

标签: java generics reflection stack return-type

我有这样的方法:

public File method1(){
    method2()
}

public method2(){
do something..
and get method1 return type(in this case File)
}

我如何得到它?我试过这样的..

Throwable t = new Throwable();
StackTraceElement[] elements = t.getStackTrace();

并获取元素的所有方法。之后,getReturnType,但它不起作用。我也试过

public File method1(){
    method2(this.getClass());
}

public method2(Class<?> className){
   //problem here
}

但问题在于我无法比较两个元素,堆栈上的元素和classname.getMethods()中的元素。

有没有办法可以将方法返回类型发送到method2?我需要这个因为制作一些历史记录。我知道可以用aspectJ完成,但我必须以某种方式这样做。

修改

我遇到的主要问题是我可以获得堆栈输出,并查看调用我的方法2的方法 - 这是我需要的一个片段!此外,我需要该方法的返回类型,但堆栈不保存该信息。现在,我可以从“调用method2的方法”的类中获取所有方法。这些方法的列表,包含所有内容,返回类型,输入参数..但这是一个相当大的列表,63种方法。所以我必须以某种方式比较它们以找出哪一个是FROM STACK。我无法使用名称对它们进行篡改,因为有些不同于返回类型,哈希码是不同的 - 这就是我被卡住的地方。

4 个答案:

答案 0 :(得分:2)

<强>更新

如果你真的需要从堆栈跟踪(我强烈 强烈 建议避免)这样做,我认为你不能。堆栈跟踪可以告诉您类和方法名称,但它不包括方法的参数类型,因此如果方法重载,则无法分辨哪个名为method2

我建议你重温一下你的设计。如果method2需要知道调用它的方法的返回类型,那么有问题的方法应该将该信息传递给method2。尝试从运行时堆栈中收集该信息不仅效率低下,而且还是设计红旗。

示例:

public File method1(File f) {
    // ...

    method2(File.class);
}

public String method1(String s) {
    // ...

    method2(String.class);
}

public Foo method1(Foo f) {
    // ...

    method2(Foo.class);
}

我们有三个method1重载。这不是method2的问题,因为每个告诉 method2它的返回类型是什么 - 或者更准确地说,我希望它需要什么method2为它或其他什么创造。

原始回答

对于您列出的特定情况(尤其是问题末尾),您可以这样做:

public File method1(){
    method2(File.class);
}

File.classClass类的File个实例。

对于在类中查找方法返回值类型的一般情况,可以使用reflection API。通过Class.forName获取包含该方法的类的Class实例,使用Class#getMethod在该Class实例上查找该方法,然后在Method#getReturnType上使用{{3}} {1}}找出返回类型的类。

答案 1 :(得分:2)

为什么反思这么困难?

public File method1() {
    method2()
}

public void method2() {
    Class<?> returnType = this.getClass().getMethod("method1").getReturnType();
}

当然,你必须处理例外情况。

答案 2 :(得分:0)

如果要返回的类具有空构造函数,则可以在method2()中本地构建返回类型的实例并使用它,但这是危险的而不是通用的。

您可以执行x.getClass()。getName()并执行切换操作。

但我建议您考虑重新构建此项以使用AspectJ并在父级调用中设置一个切点,以便在堆栈过低之前收集您真正想要的信息。我猜你的意图有点,但是每当你解析堆栈输出的类型信息时,我认为设计值得再看。

答案 3 :(得分:0)

更新回答

使用StackTrace和Reflection的组合

import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Vector;

public class CallingMethodReturnType
{
    public static void main( String[] args )
    {
        CallingMethodReturnType app = new CallingMethodReturnType();
        app.method1();
        app.method3();
    }

    public File method1(){
        method2();
        return null;
    }

    public ArrayList method3(){
        method4();
        return null;
    }

    public Vector method4() {
        method2();
        return null;
    }

    public void method2(){
        Method method;
        try {
            StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
            StackTraceElement ste = stackTraceElements[2];
            String callerMethodName = ste.getMethodName();
            method = this.getClass().getMethod(callerMethodName, null);
            Class returnType = method.getReturnType();
            System.out.println(returnType);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }
}

如果您关心表现,还要检查问题How do I find the caller of a method using stacktrace or reflection?

原始回答

您可以像这样使用反射API

    public method2(){
     //do something and get method1 return type(in this case File)
     Method method = this.getClass().getMethod("method1", null);
     Class returnType = method.getReturnType();
    }