2010-06-11 39 views

Trả lời

15

Kể từ khi phương pháp này không đối tượng chính họ, họ không có các thuộc tính trực tiếp (như bạn mong đợi với các hàm hạng nhất trong các ngôn ngữ như JavaScript).

Gần nhất bạn có thể làm là gọi Car.class.getMethods()

Car.class là một đối tượng Class mà bạn có thể sử dụng để gọi bất kỳ phương pháp phản xạ.

Tuy nhiên, theo như tôi biết, một phương pháp không thể tự xác định được.

1

thử này,

import java.lang.reflect.*; 
    public class DumpMethods { 
     public static void main(String args[]) { 
      try { 
       Class c = Class.forName(args[0]); 
       Method m[] = c.getDeclaredMethods(); 
       for (int i = 0; i < m.length; i++) 
        System.out.println(m[i].toString()); 
      } catch (Throwable e) { 
       System.err.println(e); 
      } 
     } 
    } 
32

Bạn có thể lấy chuỗi như thế này:

Car.class.getDeclaredMethods()[0].getName(); 

Đây là đối với trường hợp của một phương pháp duy nhất trong lớp học của bạn. Nếu bạn muốn để lặp qua tất cả các phương pháp khai báo, bạn sẽ phải lặp qua mảng trả về bởi Car.class.getDeclaredMethods():

for (Method method : Car.class.getDeclaredMethods()) { 
    String name = method.getName(); 
} 

Bạn nên sử dụng getDeclaredMethods() nếu bạn muốn xem tất cả trong số họ, getMethods() sẽ trở lại chỉ công cộng phương pháp.

Và cuối cùng, nếu bạn muốn xem tên của phương pháp, được thực hiện vào lúc này, bạn nên sử dụng mã này:

Thread.currentThread().getStackTrace()[1].getMethodName(); 

này sẽ nhận được một stack trace cho thread hiện hành và lợi nhuận tên của phương thức ở trên cùng của nó.

+0

Cảm ơn, tôi e rằng tôi không thực sự muốn bị ràng buộc với điều "một phương pháp mỗi lớp" ... – drozzy

+0

Bạn có thể có được tất cả các phương pháp của lớp học hoặc chỉ phương pháp đang được thực hiện tại thời điểm này. Xem chỉnh sửa của tôi. :) – Malcolm

+0

Cảm ơn. Hiếu kỳ. Nhưng tôi cần một tên của một phương thức hiện không thực hiện. Nó có vẻ như java không cung cấp một cách để làm điều đó ... – drozzy

-1

Đợi đã, vì bạn đã biết tên phương thức, bạn có thể chỉ cần nhập nó làm chuỗi không?

Thay vì (giả) Class.methodName.toString(), chỉ cần sử dụng "methodName".

Nếu không, bạn có thể sử dụng Class#getDeclaredMethods() để có được tất cả các phương pháp trong một lớp học

+7

Tôi không muốn sử dụng chuỗi. Tôi có thể cấu trúc lại tên phương thức của mình trong tương lai. – drozzy

+1

Các IDE có khả năng xem xét các chuỗi khi tái cấu trúc – Bozho

13

Vì vậy, bạn muốn để có được tên của phương pháp hiện đang thực hiện ? Đây là một cách hơi xấu xí để làm điều đó:

Exception e = new Exception(); 
e.fillInStackTrace(); 
String methodName = e.getStackTrace()[0].getMethodName(); 
+0

Thực ra, this.getClass(). GetEnclosingMethod() hoạt động tốt! – momomo

+0

momomo, không, không. Kiểm tra lớp học { @Test kiểm tra void công khaiĐịnh nghĩa() { khẳng định (this.getClass(). GetEnclosingMethod() == null); } } –

Các vấn đề liên quan