Propertiesの代わりにAnnotationを使う

2719 ワード

△今は一知半解だと思いますが、後ではっきりしたら、補足します.

Annotation基本操作


Classクラスでは、すべてのAnnotationを取得するための操作方法が提供されています:public Annotation[ ] getAnnotations()例:Annotation取得
@SuppressWarnings("serial")
@Deprecated
class Student implements Serializable{  
}
public class TestAnnotation {
    public static void main(String[] args) {
        Class> cls = Student.class;
        Annotation an [] = cls.getAnnotations();
        for (int i = 0; i < an.length; i++) {
            System.out.println(an[i]);
        }
    }
}


最終的には1つのAnnotationしか得られなかった.これは、その作用範囲が定義されているからです.@Deprescatedのみがプログラム実行時に機能します.
Annotationの役割範囲の種類は、Javaという列挙クラスを問い合わせることができます.lang.annotation.RetentionPolicy、このクラスには3つのAnnotationの範囲が定義されています:1.CLASS:クラスに保存されている2.RUNTIME:運転時に機能する3.SOURCE:ソースコードで機能
Annotationを定義し、その値を取得することを学びます.
@Retention(value = RetentionPolicy.RUNTIME)  // Annotation 
@interface MyFactory{
    public String name() default "mldn";   // ,name mldn
    public String val();
}

@MyFactory(val = "hello")  // value , Student 。
class Student implements Serializable{
    
}

public class TestAnnotation {
    public static void main(String[] args) {
        Class> cls = Student.class;
        MyFactory an = cls.getAnnotation(MyFactory.class);
        System.out.println(an.name());
        System.out.println(an.val());
        }
    }

出力結果:
mldn
hello

Propertiesの代わりに
ほとんどの場合、プロファイルを変更したくないからです.この方法により,構成をプログラムに書き戻すことができ,プログラムから効率的に分離することができる.ここで参考にしたのはservletの開発経験です.
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyFactoryClass{
    public String className();// 
}

interface Message {
    public void print(String str);
}

class Email implements Message {
    @Override
    public void print(String str) { 
         System.out.println("eMail  " + str);
    }
}

class News implements Message {
    @Override
    public void print(String str) {
        System.out.println("news  " + str);
    }
}

class factory {
    public static Message getInstance(String str) {
        try {
            return (Message) Class.forName(str).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

@MyFactoryClass (className ="cn.mldn.demo.Email")
public class TestDemo {
    public static void main(String[] args) throws Exception{
        Class> cls = TestDemo.class;
        MyFactoryClass an = cls.getAnnotation(MyFactoryClass.class);
        String name = an.className();
        Message mes = (Message)factory.getInstance(name) ;
        mes.print(" ");   }
}