2009-07-02 17 views
9

मेरा जावा जंगली है इसलिए कृपया मेरे साथ भालू। सी में मैं कर सकता हूं:जावा स्थैतिक विधि घोषणा में वर्तमान वर्ग का उपयोग

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

जावा में, क्या मैं वर्तमान में परिभाषित प्रकार के नाम या वर्ग को लेक्सिक रूप से प्राप्त कर सकता हूं। उदाहरण के लिए, अगर मेरे पास है:

import org.apache.log4j.Logger; 

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

यह गलत getLogger() बहस में "myClass" दोहराने के लिए लगता है। मुझे "getLogger (__ CLASS__)" या "getLogger (this.class)" या कुछ चाहिए। (मुझे पता है कि उनमें से दोनों मूर्ख हैं लेकिन उन्हें उस बिंदु को इंगित करना चाहिए जो मैं ढूंढ रहा हूं।) क्या जावा कंपाइलर वास्तव में नहीं जानता कि यह किस वर्ग में है, क्योंकि यह स्रोत को संसाधित करता है?

+0

तुम भी उदाहरण चर के रूप में यह है और का उपयोग करें "this.getClass सकता है पाने के लिए() "। उदाहरण विशेषता का उपयोग करना एक बेहतर विचार होगा, बशर्ते कि आपको वास्तव में कक्षा विशेषता के रूप में इसकी आवश्यकता न हो। – OscarRyz

+0

संकलक जानता है कि यह कौन सी कक्षा है, लेकिन क्या आप नहीं जानते कि आप कौन सी कक्षा लिख ​​रहे हैं? क्षमा करें, बस मजाक कर रहा है ... मुझे वह समस्या थी - लगभग एक ही कोड - लेकिन मुझे MyClass.class से बेहतर कुछ नहीं मिला है: -/कोड टेम्पलेट्स और रीफैक्टरिंग के साथ एक अच्छा आईडीई होना चाहिए ... –

+0

मेरी इच्छा है जावा यह था। मैं सिंटैक्स 'static.class' की अनुशंसा करता हूं। – Boann

उत्तर

9

दुर्भाग्यवश, यदि आप static संदर्भ में हैं (जैसा कि आप यहां हैं) तो कोई आसान तरीका नहीं है। अगर लॉगर एक आवृत्ति चर थे, तो आप getClass() का उपयोग कर सकते हैं, लेकिन फिर आपको उप-वर्गों के बारे में चिंता करनी होगी।

इस विशेष मामले के लिए, वैकल्पिक विकल्प log5j का उपयोग करना है। log5j getLogger() जैसी सुविधा विधियों के साथ log4j के चारों ओर एक रैपर है, जो ढेर को चलकर सही कक्षा का अनुमान लगाता है। तो अपने कोड बन जाएगा:

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

और आप अपने सभी वर्गों में कॉपी और पेस्ट कर सकते हैं एक ही घोषणा बिना किसी समस्या के।

6

मैं विरोध नहीं कर सका।

यहाँ mmyers संदर्भित करता है, लेकिन घर बनाया :)

मूल रूप से आप एक अपवाद फेंक और वर्ग के नाम प्राप्त करने के लिए ढेर के 2 तत्व मिल के कार्यान्वयन है।

मुझे अभी भी लगता है कि इसे उदाहरण के सदस्य के रूप में रखना बेहतर है।

:)

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

उपयोग:

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

यह मेरे घर के बने लॉगिंग रैपर की तरह दिखता है। :) –

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

IMHO अधिक साफ रास्ता स्टैक ट्रेस

संबंधित मुद्दे