Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取被调用方法的返回值?_Java_Reflection - Fatal编程技术网

Java 如何获取被调用方法的返回值?

Java 如何获取被调用方法的返回值?,java,reflection,Java,Reflection,我试图在java中实现某种反射。 我有: P类{ 双t(双x){ 返回x*x; } 双f(字符串名,双x){ 方法; Class EnclosuringClass=getClass().GetEnclosuringClass(); if(封闭类!=null){ 方法=EnclosuringClass.getDeclaredMethod(名称,x); 试一试{ 方法调用(this,x); }捕获(例外e){ e、 printStackTrace(); } } } 类o扩展了P{ 双c(){ 返回f

我试图在java中实现某种反射。 我有:

P类{
双t(双x){
返回x*x;
}
双f(字符串名,双x){
方法;
Class EnclosuringClass=getClass().GetEnclosuringClass();
if(封闭类!=null){
方法=EnclosuringClass.getDeclaredMethod(名称,x);
试一试{
方法调用(this,x);
}捕获(例外e){
e、 printStackTrace();
}
}
}
类o扩展了P{
双c(){
返回f(“t”,5);
}
}

如何从新的o().c()中获取值?

将虚拟类作为参考,您可以相应地更改代码-

import java.lang.reflect.Method;

public class Dummy {

    public static void main(String[] args) throws Exception {
        System.out.println(new Dummy().f("t", 5));
    }

    double t(Double x) {
        return x * x;
    }

    double f(String name, double x) throws Exception {
        double d = -1;
        Method method;
        Class<?> enclosingClass = getClass();
        if (enclosingClass != null) {
            method = enclosingClass.getDeclaredMethod(name, Double.class);
            try {
                Object value = method.invoke(this, x);
                d = (Double) value;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return d;
    }
}
import java.lang.reflect.Method;
公共类虚拟{
公共静态void main(字符串[]args)引发异常{
System.out.println(新的Dummy().f(“t”,5));
}
双t(双x){
返回x*x;
}
双f(字符串名,双x)引发异常{
双d=-1;
方法;
类封闭类=getClass();
if(封闭类!=null){
method=enclosingClass.getDeclaredMethod(名称,Double.class);
试一试{
对象值=method.invoke(this,x);
d=(双)值;
}捕获(例外e){
e、 printStackTrace();
}
}
返回d;
}
}
运行这个类。

invoke()
方法返回在该方法执行后返回的对象!因此您可以尝试

Double dd = (Double)method.invoke(this,x);
double retunedVal = dd.doubleValue();

您是否检查了
方法.invoke(this,x);
的返回值?修复了该问题。我收到异常:“线程中的异常”main“java.lang.RuntimeException:不可编译的源代码-未报告的异常java.lang.exception;必须捕获或声明为引发”你需要处理异常。将调用代码放在try-catch块中。现在我得到了NoSuchMethodException。你是否尝试使用我粘贴在这里的代码?另外,发布完整的堆栈跟踪总是更好,这样很容易解决问题。我只是用伪类更新了答案,运行它并将其用作更改代码的引用你的代码。
Double dd = (Double)method.invoke(this,x);
double retunedVal = dd.doubleValue();