2010-11-04 17 views
7

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Class.html#getDeclaredMethods%28%29 के अनुसार, Class.getDeclaredMethods() केवल तरीकों "वर्ग द्वारा घोषित" शामिल करना चाहिए।getDeclaredMethods() और छिपा सुपर वर्ग स्थिर विधि

import java.util.Arrays; 

class A { 
public static A m1() { return null; } 
public static A m2() { return null; } 
public static A m3() { return null; } 
} 

class B extends A { 
public static A m1() { return null; } 
public static B m2() { return null; } 
// public static Object m3() { return null; } won't compile 
} 


public class Scratch { 
public static void main(final String[] args) { 
    System.out.println(Arrays.asList(B.class.getDeclaredMethods())); 
} 
} 

कुछ चीजें हैं जो मेरे लिए काफी अजीब/आश्चर्य की बात लग रही है: हालांकि, मैं नीचे परीक्षण कोड के साथ कुछ बहुत आश्चर्य की बात परिणाम हो रही है

  • संकलक B.m3 के बारे में शिकायत() एएम 3() के साथ एक असंगत वापसी प्रकार है। यह जेएसएल 8.4.8.3 (पृष्ठ 225 v3 langspec-3.0.pdf) द्वारा निर्धारित है। लेकिन मैं उत्सुक हूं, इस प्रतिबंध को स्थैतिक तरीकों पर क्यों लागू करने की आवश्यकता है। मेरी समझ यह है कि स्थैतिक तरीकों को छुपाया जा सकता है और अतिरंजित नहीं किया जा सकता है, और संदर्भ संकलन समय पर हल किया गया है, तो इस प्रतिबंध के पीछे तर्क क्या है?

  • दो एम 2() पद्धतियों उत्पादन में शामिल हैं। यह दावा दावा करता है कि getDeclaredMethods() केवल "कक्षा द्वारा घोषित" विधियों को लौटाता है, और "विरासत विधियों को छोड़ देता है"। मैं A.m2 नहीं दिख रहा है() के रूप में बी "द्वारा घोषित"

  • एक एम 1() उत्पादन में शामिल है। पिछले बिंदु के बाद, अगर यह() भावना getDeclaredMethods जाने के लिए किए गए दो एम 2(), कारण है कि यह दो एम 1() के रूप में अच्छी तरह से वापस नहीं करता है वापसी? वे सभी दो अलग-अलग तरीकों के बाद हैं, और एक दूसरे से छिपा हुआ है। मुझे m1() और m2() के मामले में रिटर्न प्रकार को छोड़कर एम 1() और एम 2() के मामले में कोई भी मौलिक अंतर नहीं दिखता है, लेकिन जैसा कि मैं समझता हूं कि वापसी प्रकार विधि हस्ताक्षर का हिस्सा नहीं है?

अग्रिम धन्यवाद!

+0

मेरे लिए आउटपुट में एक 'm2' शामिल है (jdk_1.6.0_21)। – axtavt

+0

मुझे jdk_1.6.0u18 का उपयोग करके दो एम 2() मिला। क्या यह कुछ है जो यू 18 और यू 21 के बीच तय हो गया है? अगर ऐसा है तो क्या इसके लिए कोई निश्चित टिकट था? thx – RAY

उत्तर

2

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6815786

देखें हालांकि यह पर 2009-03-11 05 1.6.0_12-B04 के खिलाफ की सूचना दी गई थी: 44: 57.0 लेकिन सूर्य पर 2010-07-22 01 इसे स्वीकार कर लिया: 25: 56.0

संक्षिप्त में:

सार (प्रतिबिंबित) Class.getDeclaredMethods() लौट रहा है विरासत में मिला तरीकों

श्रेणी जावा: classes_lang

खिलाफ

राज्य 3-स्वीकृत की सूचना दी, बग

प्राथमिकता: 3-मध्यम

जमा करें दिनांक 11-मार्च -2009

एन/ए

मूल्यांकन की जांच करेगा।

पोस्ट किया गया दिनांक: 2010-07-22 01:25:56।0

+0

"जांच करेगा" ... – RAY

+0

: डी यह या-ऐकल प्रभाव है! –

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