我有这样的方法:
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。我无法使用名称对它们进行篡改,因为有些不同于返回类型,哈希码是不同的 - 这就是我被卡住的地方。
答案 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.class
是Class
类的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();
}