2013-03-29 33 views
9

Tôi đang cố gắng đạt được một số loại phản ánh trong java. Tôi có:Làm cách nào để nhận được giá trị trả lại của phương thức được gọi?

class P { 
    double t(double x) { 
    return x*x; 
    } 

    double f(String name, double x) { 
    Method method; 
    Class<?> enclosingClass = getClass().getEnclosingClass(); 
    if (enclosingClass != null) { 
     method = enclosingClass.getDeclaredMethod(name, x); 
     try { 
      method.invoke(this, x); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

class o extends P { 
    double c() { 
    return f("t", 5); 
    } 
} 

Làm cách nào để nhận giá trị từ o(). C() mới?

+0

Bạn đã kiểm tra giá trị trả về của 'method.invoke (this, x);'? – Apurv

+0

có, nhờ câu trả lời dưới đây – c4rrt3r

Trả lời

14

Đưa lớp giả để bạn tham khảo, bạn có thể thay đổi mã của bạn accordingly-

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; 
    } 
} 

Chỉ cần chạy lớp này.

+0

Đã sửa lỗi đó. Tôi nhận được ngoại lệ: "Ngoại lệ trong thread" chính "java.lang.RuntimeException: Uncompilable mã nguồn - ngoại lệ unreported java.lang.Exception; phải được bắt hoặc tuyên bố sẽ được ném" – c4rrt3r

+0

Bạn cần phải xử lý các ngoại lệ. Đặt mã gọi trong khối try-catch. –

+0

Bây giờ tôi nhận được NoSuchMethodException – c4rrt3r

4

invoke() phương thức trả về đối tượng được trả về sau khi thực hiện phương thức đó! để bạn có thể thử ...

Double dd = (Double)method.invoke(this,x); 
double retunedVal = dd.doubleValue(); 
Các vấn đề liên quan