سؤال

وفق http://download.oracle.com/javase/1.4.2/docs/api/java/lang/class.html#getDeclaredMethods٪28٪29, ، يجب أن تتضمن class.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()));
 }
}

بعض الأشياء التي تبدو غريبة/مفاجئة بالنسبة لي:

  • يشكو المترجم من وجود نوع عودة غير متوافق مع A.M3 (). تملي هذا بواسطة JSL 8.4.8.3 (صفحة 225 V3 Langspec-3.0.pdf). لكنني فضولي ، لماذا يحتاج هذا التقييد إلى التقدم على الأساليب الثابتة. ما أفهمه هو أنه يمكن إخفاء الأساليب الثابتة وليس تجاوزها ، وأن المرجع يتم حله في وقت الترجمة ، فما هو السبب وراء هذا التقييد؟

  • يتم تضمين طريقتين M2 () في الإخراج. يبدو أن هذا يتناقض مع الادعاء بأن getDeclaredMethods () يعيد فقط الأساليب "المعلنة من قبل الفصل" ، و "يستبعد الأساليب الموروثة". لا أرى A.M2 () كـ "أعلن بواسطة" B.

  • يتم تضمين واحد M1 () في الإخراج. بعد النقطة السابقة ، إذا كان من المنطقي السماح لـ GetDeclaredMethods () بإرجاع اثنين M2 () ، فلماذا لا يعود اثنين M1 () أيضًا؟ هم بعد كل طريقتين متميزتين ، والآخر مخبأ من قبل الآخر. لا أرى أي فرق تمويلي بين حالة M1 () و M2 () باستثناء نوع الإرجاع هو نفسه في حالة M1 () ، لكن نوع الإرجاع كما أفهم ليس جزءًا من توقيع الطريقة؟

شكرا مقدما!

هل كانت مفيدة؟

المحلول

نرى http://bugs.sun.com/bugdatabase/view_bug.do؟bug_id=6815786

على الرغم من أنه تم الإبلاغ عنه مقابل 1.6.0_12-B04 في 2009-03-11 05: 44: 57.0 لكن Sun قبلته في 2010-07-22 01: 25: 56.0

باختصار:

ملخص (عكس) class.getDeclaredMethods () يعيد الطرق الموروثة

فئة Java: classes_lang

ذكرت ضد

حالة 3-قبول ، علة

أولوية: 3-Medium

تاريخ النشر 11 مارس 2009

العمل حولها ن/أ

تقييم سوف التحقيق.

تاريخ النشر: 2010-07-22 01:25:56.0

نصائح أخرى

يمكنني تأكيد أن الخطأ http://bugs.sun.com/bugdatabase/view_bug.do؟bug_id=6815786 لا تزال موجودة في Oracle Java Windows 64-Bit 1.6.0_35.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top