2013-09-05 68 views
7

tôi đã loại sau đây (lưu ý rằng phương pháp tĩnh):lấy tên lớp gọi từ phương pháp tĩnh thừa hưởng

class Base 
{ 
    public static void whosYourDaddy() 
    { 
     Class callerClass = // what should I write here to get caller class? 
     System.out.print(callerClass.getName()); 
    } 
} 

Class A extends Base 
{ 
    public static void foo() 
    { 
     A.whosYourDaddy(); 
    } 
} 

Class B extends Base 
{ 
    public static void bar() 
    { 
     B.whosYourDaddy(); 
    } 
} 

Và khi tôi gọi:

A.foo(); 
B.bar(); 

Tôi muốn để có được kết quả: AB thay vì BaseBase. Thậm chí có thể với các phương thức tĩnh (trong Java 7) không?

+0

những gì bạn đã hạ cánh trên là giải pháp ưa thích? – cdaringe

+0

@cdaringe Xem câu trả lời được chấp nhận. –

Trả lời

6

gì bạn có thể làm, nhưng không nên :) là sử dụng phương pháp Throwable getStackTrace. Ngoài mùi, điều này là khá chậm, bởi vì nhận được dấu vết ngăn xếp không phải là nhanh. Nhưng bạn sẽ nhận được một mảng StackTraceElement và mỗi lớp sẽ chứa lớp của lớp teh đang gọi nó (và bạn cũng có thể lấy tệp và dòng và nếu bạn tách riêng hai tệp bằng một: bạn có thể nhận được liên kết có thể nhấp vào eclipse, không phải là tôi đã bao giờ làm một điều như vậy ...).

Something như

String className = new Throwable().getStackTrace()[1].getClassName(); 

Hy vọng rằng sẽ giúp :)

+0

Phù thủy! :) * Ngoài mùi, điều này là khá chậm, bởi vì nhận được dấu vết ngăn xếp không phải là nhanh chóng. * Trên thực tế, tôi nghĩ rằng nó chỉ chậm trong vài lần đầu tiên nó chạy. Tôi tin rằng HotSpot đã tối ưu hóa điều này. Hãy để tôi có một cái nhìn cho các tài liệu tham khảo ... – Muel

+0

Tham khảo cho các bình luận trước: http://www.javaspecialists.eu/archive/Issue187.html – Muel

+0

Tất nhiên tôi đang suy đoán về tốc độ bởi vì tôi sẽ không bao giờ làm như vậy mọi thứ, ngay cả khi nó thực sự đơn giản hóa việc gỡ lỗi kiểu printf trong nhật thực, nhưng nếu tôi có, tôi sẽ không đo nó; Tôi chỉ có thể phỏng đoán rằng chi phí của các cuộc gọi getStackTrace tùy ý có thể là đáng kể. Cảm ơn bạn đã tham khảo. –

-1

Thậm chí có thể với các phương pháp tĩnh (trong Java 7) không?

Không, phương pháp tĩnh không được kế thừa. Chỉ các phương thức không tĩnh được kế thừa.

Trong trường hợp bạn thay đổi Base (và các lớp con) như sau:

class Base 
{ 
    public void whosYourDaddy() 
    { 
    Class<?> callerClass = getClass(); 
    System.out.print(callerClass.getName()); 
    } 
} 
0

 private static class Reflection { 
    private static final SecurityManager INSTANCE = new SecurityManager(); 
    static Class getCallClass() { 
     return INSTANCE.getCallClass(2); 
    } 
    private Reflection() { 
    } 
    private static class SecurityManager extends java.lang.SecurityManager { 
     public Class getCallClass(int i) { 
      Class[] classContext = getClassContext(); 
      if (i >= 0 && i + 1 < classContext.length) { 
       return classContext[i + 1]; 
      } 
     return null; 
     } 
    }; 
}

+0

một chút giải thích sẽ tốt đẹp –