2009-07-02 35 views
9

Java của tôi bị gỉ nên hãy chịu theo tôi. Trong C Tôi có thể làm:Sử dụng lớp hiện tại trong khai báo phương thức tĩnh Java

int someFunc(void) 
{ 
    printf("I'm in %s\n", __func__); 
} 

Trong Java, tôi có thể lexically nhận được tên hoặc loại lớp hiện đang được xác định. Ví dụ: nếu tôi có:

import org.apache.log4j.Logger; 

class myClass { 
    private static final Logger logger = Logger.getLogger(myClass.class); 
... 
} 

Có vẻ như sai khi lặp lại "myClass" trong đối số getLogger(). Tôi muốn "getLogger (__ CLASS__)" hoặc "getLogger (this.class)" hoặc một cái gì đó. (Tôi biết cả hai đều là ngớ ngẩn nhưng họ nên trỏ đến những gì tôi đang tìm kiếm.) Trình biên dịch Java thực sự không biết lớp đó là gì ở giữa vì nó xử lý nguồn?

+0

Bạn cũng có thể có nó như biến dụ và sử dụng "this.getClass() ". Sử dụng thuộc tính instance sẽ là một ý tưởng tốt hơn, trừ khi tất nhiên bạn thực sự cần nó như là một thuộc tính class. – OscarRyz

+0

trình biên dịch biết lớp đó là gì, nhưng bạn không biết lớp bạn đang viết là gì? xin lỗi, chỉ đùa ... Tôi đã có vấn đề đó - gần như cùng một mã - nhưng tôi đã không tìm thấy bất cứ điều gì tốt hơn so với MyClass.class: -/cần phải có một IDE tốt đẹp với các mẫu mã và refactoring ... –

+0

Tôi muốn Java đã có điều này. Tôi muốn giới thiệu cú pháp 'static.class'. – Boann

Trả lời

9

Thật không may, không có cách nào dễ dàng hơn nếu bạn đang ở trong ngữ cảnh static (như bạn đang ở đây). Nếu logger là một biến cá thể, bạn có thể sử dụng getClass(), nhưng sau đó bạn sẽ phải lo lắng về các lớp con.

Đối với trường hợp cụ thể này, cách khác là sử dụng log5j để thay thế. log5j là một trình bao bọc xung quanh log4j với các phương thức tiện lợi như getLogger(), trong đó đưa vào lớp đúng bằng cách đi lên ngăn xếp. Vì vậy, mã của bạn sẽ trở thành:

import com.spinn3r.log5j.Logger; 
class myClass { 
    private static final Logger logger = Logger.getLogger(); 
    ... 
} 

Và bạn có thể sao chép và dán cùng một tuyên bố vào tất cả các lớp mà không gặp bất kỳ sự cố nào.

6

Tôi không thể cưỡng lại.

Đây là việc thực hiện những gì mmyers đề cập nhưng nhà làm :)

Về cơ bản bạn ném một ngoại lệ và được những yếu tố thứ 2 của ngăn xếp để có được tên lớp.

Tôi vẫn nghĩ tốt hơn nên có nó làm thành viên cá thể.

:)

package some.utility.packagename; 
import java.util.logging.Logger; 

import some.other.packagename.MyClass; 

public class LoggerFactory { 
    public static Logger getLogger() { 
     StackTraceElement [] s = new RuntimeException().getStackTrace(); 
     return Logger.getLogger(s[1].getClassName()); 
    } 
    public static void main (String [] args) { 
     MyClass a = new MyClass(); 
    } 
} 

Cách sử dụng:

package some.other.packagename; 
import java.util.logging.Logger; 

import static some.utility.packagename.LoggerFactory.getLogger; 

public class MyClass { 

    private static final Logger logger = getLogger(); 
    static{ 
     System.out.println(MyClass.logger.getName()); 
    } 

} 
+0

Điều đó trông giống như trình bao đăng nhập tự chế của riêng tôi. :) –

4
StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 
return trace[2].getClassName(); 

cách IMHO gọn gàng hơn để có được stack trace

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