كيف يمكنني قوة جافا فرعية لتحديد الشرح?
-
01-07-2019 - |
سؤال
إذا فئة محددة من الشرح ، هي بطريقة أو بأخرى من الممكن أن فرقة فرعية لتحديد نفس الشرح?
فعلى سبيل المثال لدينا بسيطة فئة/فئة فرعية الزوج أن حصة هذه @Author @interface.
ما أود القيام به هو قوة لكل أخرى فرعية لتحديد نفس @Author
الشرح منع RuntimeException
في مكان ما على الطريق.
TestClass.java:
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@interface Author { String name(); }
@Author( name = "foo" )
public abstract class TestClass
{
public static String getInfo( Class<? extends TestClass> c )
{
return c.getAnnotation( Author.class ).name();
}
public static void main( String[] args )
{
System.out.println( "The test class was written by "
+ getInfo( TestClass.class ) );
System.out.println( "The test subclass was written by "
+ getInfo( TestSubClass.class ) );
}
}
TestSubClass.java:
@Author( name = "bar" )
public abstract class TestSubClass extends TestClass {}
أعرف أنني أستطيع أن أعدد كل الشروح في وقت التشغيل والتحقق من المفقودين @Author
, ولكن أود حقا أن تفعل هذا في وقت الترجمة ، إذا كان ذلك ممكنا.
المحلول
يمكنك أن تفعل ذلك مع JSR 269, في وقت الترجمة.انظر : http://today.java.net/pub/a/today/2006/06/29/validate-java-ee-annotations-with-annotation-processors.html#pluggable-annotation-processing-api
نصائح أخرى
أنا متأكد تماما أن هذا من المستحيل أن تفعل ذلك في وقت الترجمة.
ولكن هذا هو واضح المهمة من أجل "الوحدة"-اختبار.إذا كان لديك الاتفاقيات مثل هذا الذي كنت أود القسري ، ولكن الذي يمكن أن يكون من الصعب أو من المستحيل أن تحقق مع المترجم ، "وحدة"-الاختبارات هي وسيلة بسيطة للتحقق منها.
احتمال آخر هو تنفيذ قاعدة مخصصة في ثابت محلل.هناك العديد من الخيارات هنا أيضا.
(أنا وضعت وحدة في ذعر يقتبس, لأن هذا هو حقا اختبار الاتفاقيات بدلا من وحدة معينة.ولكن يجب أن تعمل جنبا إلى جنب مع وحدة-الاختبارات).
هل يمكن أن تجعل الشرح (مثلا ، @EnforceAuthor) مع @الموروثة عن الفائقة و استخدام مترجم الشروح (منذ جافا 1.6) إلى اللحاق في وقت الترجمة.ثم لديك إشارة إلى فرعية و يمكن أن تحقق إذا كان آخر الشرح (مثلا ، @المؤلف)) مفقود.هذا من شأنه أن يسمح إلغاء تجميع مع رسالة خطأ.