February 21, 2014

Annotations

အခြေခံအားဖြင့် ပရိုဂရမ်တစ်ခုတွင် အချက်အလက်များနှင့် လော့ဂျစ်များ ပါဝင်ကြ၏။ ပရိုဂရမ်အတွင်း အသုံးပြုနေသော အချက်အလက်များအား Data ဟုခေါ်၍၊ ပရိုဂရမ်အတွက် အသုံးပြုသော အချက်အလက်များအား Metadata ဟု ခေါ်ဆိုကြ၏။

ဥပမာအားဖြင့် Javadoc တွင်ပါဝင်သော ပရိုဂရမ်ရေးသားသူ၊ ရေးသားသည့်နေ့၊ ပြုပြင်သည့် အချက်အလက် အစရှိသည်တို့သည် Metadata များ ဖြစ်ကြသည်။ Java ဘာသာရပ်တွင် @Deprecated, @Author အစရှိသည့် အမှတ်အသားများအား၊ class များ၊ method များနှင့် fields များတွင် javadoc ရေးသားရန် အတွက်အသုံးပြုခဲ့ကြ၏။ အဆိုပါ အမှတ်အသားများအား javadoc generator မှ ကြည့်ရှု၍ သင့်လျှော်သလို javadoc များအား ထုတ်လုပ်ပေးနိုင်ပါသည်။ Developer များသည် အခြားသော ရည်ရွယ်ချက်များတွင် အသုံးပြုရန် metadata များအား ပြင်ပမှ ထည့်သွင်းပေးရန် လိုအပ်ခဲ့ကြ၏။

Java SE 5 အရောက်တွင် Annotation ဆိုသည့် interface အမျိုးအစားအား အသစ်ဖြည့်စွက်လာခဲ့ပြီး metadata များအား Source Code များတွင် ရေးသားလာနိုင်ခဲ့ပြီး၊ ရေးသားထားသော metadata များအားလည်း အလုပ် လုပ်နေစဉ်တွင် အသုံးပြုလာနိုင်ခဲ့ပါသည်။

 Annotation များအား အသုံးပြုခြင်းအားဖြင့် metadata များအား၊ java packages, classes, methods နှင့် fields များတွင် ဖြည့်စွက်ပေးနိုင်ပါသည်။ အဆိုပါ metadata များအား သက်ဆိုင်ရာ tools များအား အသုံးပြု၍ compile လုပ်စဉ်တွင်၎င်း၊ လိုအပ်ပါက compile လုပ်ထားသော class များအတွင်း ဖြည့်စွက်၍၊ အလုပ်လုပ်နေစဉ်တွင်၎င်း အသုံးပြုနိုင်ပါသည်။ ဤကဲ့သို့ Annotation အား အသုံးပြု၍ metadata များအား Runtime ဆီသို့ပေးပို့နိုင်ခြင်းကြောင့် metadata များ၏ အသုံးပြုပုံအသစ်တို့ကိုလည်း မွေပေါ်ပေါက်စေခဲ့ပါသည်။

Java EE Application များတွင် Annotation များအား အသုံးပြု၍ metadata များအား Source Code များတွင် ထည့်သွင်း ရေးသားလာနိုင်ပြီး၊ ၎င်းတို့အား Server Container ဘက်တွင် ရေးသားလာနိုင်ခဲ့ပါသည်။ Annotation မပေါ်ပေါက်ခင်ကာလ အထိ metadata များအား XML Configuration File များတွင် ရေးသားရပြီး၊ အလွန်ခက်ခဲ ခဲ့ပါသည်။ Java EE Application များအား ရေးသားရာတွင် XML များမှာရှုပ်ထွေးလွန်းသောကြောင့် Java EE အပလီများမှာ လေ့လာရခက်ခဲသည်ဟု အပြောများခဲ့ကြ၏။ Java EE 5 မတိုင်ခင်က EJB မှာ အလွန်ရေးသားရ ခက်ခဲခဲ့သော်လည်း Java EE 5 အရောက်တွင် Annotation များအား လွယ်ကူစွာ အသုံးပြုလာနိုင်ခဲ့ခြင်းကြောင့် ပိုမိုရေးသားရ လွယ်ကူစေခဲ့ပါသည်။ လက်ရှိအနေအထားတွင် Annotation အား Standard Java EE တွင်သာမက၊ Spring ကဲ့သို့သော Opensource Framework များတွင်လည်း တွင်ကျယ်စွာ အသုံးပြုလာကြသည်ကို တွေ့ရပါသည်။


Meta Annotation


Annotation အား ရေးသား ရာတွင်လည်း ၎င်း၏ Meta Information များအား ဖော်ပြရာ၌ Annotation များအား အသုံးပြုကြပါသည်။ အထက်တွင် ဖော်ပြထားသော @Target သည် Annotation အမျိုးအစားအား ဖော်ပြနေသော Annotation တစ်မျိုး ဖြစ်ပြီး၊ ၎င်းအား Meta Annotation ဟု ခေါ်ဆိုပါသည်။
@Target(ElementType.METHOD)
public @interface MethodInfo {
 String value();
}

အထက်ပါနမှုနာထဲတွင် @Target သည် Annotation အတွက် Metadata များအား ဖော်ပြနေသော Annotation ဖြစ်ပြီး ၎င်းအား Meta Annotation ဟု ခေါ်ဆိုပါသည်။


Type of Annotations


  1. Documentated
    အကယ်၍ Source Code ထဲတွင် @Documentated Annotation အား ရေးသားထားပါက၊ ဘယ်နေရာတွင် ရေးထားပါစေ ၎င်း Annotation ၏ အချက်အလက်များအား Javadoc အား အလိုအလျှောက် ထုတ်လုပ်ပေးသော Tools တွင် အသုံးပြုမည် ဖြစ်ပါသည်။ 
  2. Inherited
    ဤ Meta Annotation သည် အသုံးပြုနေသော Annotation သည် Super Class ထံမှ Annotation Type အား Inherited လုပ်ထားကြောင်းအား ဖော်ပြနေပါသည်။ 
  3. Retention
    Annotation အား အသုံးပြုမည့် အဆင့်အား ဖော်ပြနေသော Meta Annotation ဖြစ်ပါသည်။ ဤ Annotation တွင် RetentionPolicy ၃ မျိုး ရေးသား အသုံးပြုနိုင်ပါသည်။
    • Class
      ဤ တန်ဖိုးအား အသုံးပြုထားပါက၊ Annotation အား Compile လုပ်သည့် အခါတွင် ထည့်သွင်းပြီး၊ Class File အတွင်း တပါတည်း ထည့်သွင်းပေးမည်ဖြစ်သည်။
    • Runtime
      Runtime အား အသုံးပြုထားပါက JVM တွင် အလုပ်လုပ်နေစဉ် အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။ ပါဝင်သော Annotation များအား၊ Reflection API အား အသုံးပြု၍ သိရှိနိုင်မည် ဖြစ်ပါသည်။
    • Source
      ဤတန်ဖိုးအား အသုံးပြုထားပါက Annotation အား Compile လုပ်ရာတွင် ထည့်သွင်း အသုံးပြုမည် မဟုတ်ပါ။
  4. Target
    Annotation အား အသုံးပြုနိုင်သည့်နေရာအား ဖော်ပြနိုင်သော Meta Annotation ဖြစ်ပြီး၊ CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE တို့တွင် အသုံးပြုနိုင်ကြပါသည်။


Standard Annotation for Java SE


လက်ရှိ ဗားရှင်း JDK1.7 တွင် အထက်ဖော်ပြပါ @Documentated, @Inherited, @Retention နှင့် @Target အစရှိသည့် Meta Annotation တို့ အပြင် အောက်ပါ Annotation များအားလည်း အသုံးပြုနိုင်ပါသည်။

Annotation Description
@Deprecated Class တစ်ခု၏ အသုံးမပြုတော့သော Member များအား ဖော်ပြရာတွင် အသုံးပြုနိုင်ပါသည်။ အဆိုပါ Member များအား အသုံးပြုပါက Warning Message အား ဖြစ်ပေါ်စေမည်ဖြစ်ပါသည်။
@Override Superclass ဒါမှမဟုတ် Interface တို့၏ Method များအား Override လုပ်ထားသော Method များတွင် ရေးသားရပါသည်။ မရေးသားထားပါက Compile လုပ်သည့် အခါတွင် Warning Message အား ဖြစ်ပေါ်စေမည် ဖြစ်ပါသည်။
@SuppressWarning(value=”type”) Class သို့မဟုတ် Method တို့တွင် ရေးသား အသုံးပြုနိုင်ပြီး၊ သတ်မှတ်ထားသော Warning များအား တားမစ်ရာတွင် အသုံးပြုပါသည်။



Writing Custom Annotation


အထက်တွင် ဖော်ပြသကဲ့သို့ Annotation များမှာ Framework နှင့် Server Application များတွင် အသုံးပြု များကြသည် ဆိုသော်လည်း၊ Developer ကိုယ်တိုင်လည်း Annotation များအား ရေးသား၍ အသုံးပြုနိုင်ပါသည်။
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MethodParam {
 String value() default "Default Value";
}

  • Annotation အား ရေးသားရန် @interface အား အသုံးပြု၍ ရေးသားရပါသည်။ 
  • Method များတွင် Parameter အား အသုံးပြု၍ မရပါ။ 
  • Method များတွင် throw ကိုလည်း အသုံးပြု၍ မရပါ။ 
  • Method များ၏ Return Type အဖြစ်လည်း၊ Primitive Types များ၊ String, Class, enum, Annotation နှင့် အဆိုပါအမျိုးအစားများ၏ Array များကိုသာ အသုံးပြုနိုင်သည်။ 
  • Method များတွင် Default တန်ဖိုးများအား အစားထိုး အသုံးပြုနိုင်ပါသည်။

အထက်တွင် ရေးသားထားသော Annotation အား Class တစ်ခု၏ Method တွင် အသုံးပြု၍၊ ၎င်းအား Reflection API မှတဆင့် ခေါ်ယူကြည့်ပါမည်။ အထက်ပါ Annotation တွင် Retention ၏ တန်ဖိုးတွင် RUNTIME ဟု ရေးသား ထားသော ကြောင့် JVM ၌ အလုပ်လုပ်နေစဉ် အသုံးပြုနိုင်မည် ဖြစ်ပြီး၊ Target မှာ METHOD ဖြစ်သောကြောင့် Method များတွင် ရေးသား အသုံးပြုနိုင်ပါလိမ့်မည်။ ၎င်းတွင် value method ကို အသုံးပြုထားပြီး၊ Return Type မှာ String ဖြစ်သောကြောင့် Annotation ၏ Parameter အဖြစ် String အား အသုံးပြုနိုင်ပါလိမ့်မည်။ ထို Method တွင် default “Default Value” ဟု ရေးသားထားသောကြောင့်၊ Annotation ၏ Parameter မပါဝင်ပါက၊ အဆိုပါ Default တန်ဖိုးအား အသုံးပြုသွားပါမည်။
public class AnnotatedClass {

 @MethodParam(value="Hello Annotation")
 public void doSomething(String data) {
  System.out.println(data);
 }
}

အထက်ပါ Class တွင် doSomething method ၌ Annotation အား အသုံးပြုထားပါသည်။ value အား Hello Annotation ဟု ရေးသားသတ်မှတ်ထားပါသည်။

ရေးသားထားသော Runtime Annotation များအား၊ Reflection API အား အသုံးပြု၍ အလုပ်လုပ်နေစဉ် ခေါ်ယူ အသုံးပြုကြည့် ပါမည်။
public class AnnotationMain {
 
 public static void main(String[] args) {
  AnnotatedClass a = new AnnotatedClass();
  
  Method ms [] = a.getClass().getMethods();
  for(Method m : ms) {
   if(m.isAnnotationPresent(MethodParam.class)) {
    try {
     MethodParam mp = 
      m.getAnnotation(MethodParam.class);
     m.invoke(a, new Object[]{mp.value()});
    } catch (Exception e) {
     e.printStackTrace();
    }
   }
  }
 }

}

အထက်တွင် AnnotationClass ၏ Object a မှ Class အား ရယူကာ၎င်းတွင်ပါဝင်သော Method များအား Array အနေနှင့် ရယူပါသည်။ ထို Method များအား တစ်ခုချင်းခေါ်ယူကာ isAnnotationPresent method အား အသုံးပြု၍ အသုံးပြုလိုသော Annotation ပါမပါ စမ်းစစ်ပါသည်။ ပါဝင်ပါက getAnnotation ၏ Method အား အသုံးပြုကာ MethodParam Annotation ၏ Object အား ခေါ်ယူပါသည်။ နောက်ဆုံးတွင် Annotation ပါဝင်သော method အား invoke method အား အသုံးပြု၍ လုပ်ဆောင်စေပါသည်။ ထိုနေရာတွင် MethodParam Annotation ၏ value အား method ၏ Parameter အဖြစ်အသုံးပြုပါသည်။

အထက်ပါ Program အား စမ်းသပ်ကြည့်သောအခါ၊ အောက်ပါအတိုင်း AnnotationClass ၏ doSomething method အား Annotation ၏ value တန်ဖိုးအား အသုံးပြုကာ ခေါ်ယူနိုင်သည်ကို တွေ့ရပါသည်။


ဤနည်းအားဖြင့် Metadata များအား၊ Java Source Code များတွင် ရေးသားနိုင်ပြီး၊ ရေးသားထားသော Metadata များအားလည်း လိုအပ်သလို ပြန်လည် အသုံးပြုနိုင်မည် ဖြစ်ပါသည်။

ဆက်ပါဦးမည်။ လေးစားစွာဖြင့်။
မင်းလွင်

No comments:

Post a Comment