首页 > 代码库 > C#中的Attribute和Java中的Annotation

C#中的Attribute和Java中的Annotation

/***********注解声明***************//** * 水果名称注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitName {    String value() default "";}/** * 水果颜色注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitColor {    /**     * 颜色枚举     * @author peida     *     */    public enum Color{ BULE,RED,GREEN};        /**     * 颜色属性     * @return     */    Color fruitColor() default Color.GREEN;}/** * 水果供应者注解 * @author peida * */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface FruitProvider {    /**     * 供应商编号     * @return     */    public int id() default -1;        /**     * 供应商名称     * @return     */    public String name() default "";        /**     * 供应商地址     * @return     */    public String address() default "";}/***********注解使用***************/public class Apple {        @FruitName("Apple")    private String appleName;        @FruitColor(fruitColor=Color.RED)    private String appleColor;        @FruitProvider(id=1,name="陕西红富士集团",address="陕西省西安市延安路89号红富士大厦")    private String appleProvider;        public void setAppleColor(String appleColor) {        this.appleColor = appleColor;    }    public String getAppleColor() {        return appleColor;    }        public void setAppleName(String appleName) {        this.appleName = appleName;    }    public String getAppleName() {        return appleName;    }        public void setAppleProvider(String appleProvider) {        this.appleProvider = appleProvider;    }    public String getAppleProvider() {        return appleProvider;    }        public void displayName(){        System.out.println("水果的名字是:苹果");    }}/***********注解处理器***************/public class FruitInfoUtil {    public static void getFruitInfo(Class<?> clazz){                String strFruitName=" 水果名称:";        String strFruitColor=" 水果颜色:";        String strFruitProvicer="供应商信息:";                Field[] fields = clazz.getDeclaredFields();                for(Field field :fields){            if(field.isAnnotationPresent(FruitName.class)){                FruitName fruitName = (FruitName) field.getAnnotation(FruitName.class);                strFruitName=strFruitName+fruitName.value();                System.out.println(strFruitName);            }            else if(field.isAnnotationPresent(FruitColor.class)){                FruitColor fruitColor= (FruitColor) field.getAnnotation(FruitColor.class);                strFruitColor=strFruitColor+fruitColor.fruitColor().toString();                System.out.println(strFruitColor);            }            else if(field.isAnnotationPresent(FruitProvider.class)){                FruitProvider fruitProvider= (FruitProvider) field.getAnnotation(FruitProvider.class);                strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address();                System.out.println(strFruitProvicer);            }        }    }}/***********输出结果***************/public class FruitRun {    /**     * @param args     */    public static void main(String[] args) {                FruitInfoUtil.getFruitInfo(Apple.class);            }}==================================== 水果名称:Apple 水果颜色:RED 供应商编号:1 供应商名称:陕西红富士集团 供应商地址:陕西省西安市延安路89号红富士大厦

 

下面的代码定义了一个名字为widebright的自定义的属性,然后还有测试使用的例子,用到了“反射”了,其实我也接触不多“反射”这个东西,就是个提供运行时获取类结构等的支持的东西了,还可以用来动态加载库等,好像。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Reflection;namespace WindowsFormsApplication1{    //这里利用AttributeUsage 来设置我们的自定义属性的应用范围,这里定义的可以用于类,结构和方法的声明    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method,       AllowMultiple = true)] // multiuse attribute    class widebright : Attribute //从Attribute 继承,写一个自定义属性    {        private string strname;        public widebright(string name)        {            strname = name;        }        //添加一个允许外部访问的属性        public string Name        {            get { return strname; }            set { strname = Name; }        }    }    //写一个测试类    [widebright("widebright")]    class widebrightTestClass    {        private string name = "hahaa";        [widebright("test1")]        public void TestMethod()        {            System.Console.WriteLine("哈哈,第一个测试通过");        }        [widebright("test2")]        public void TestMethod2(string parm)        {            System.Console.WriteLine("哈哈,第二个测试通过,传过来的参数是:{0}", parm);        }        public void TestMethod3()        {            System.Console.WriteLine("哈哈,第三个测试,name的值为{0}", this.name);        }    }    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void Form1_Load(object sender, EventArgs e)        {            widebrightTestClass testClass = new widebrightTestClass();            //在程序运行时,获取自己添加进去的“自定义属性”            Type type = testClass.GetType();            testClass.TestMethod3 ();            //利用反射 运行时修改对象的私有属性            BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Instance);            type.GetField ("name",flags ).SetValue (testClass,"widebright");            //再次调用方法,应该可以看到name私有属性确实被修改成widebright了            testClass.TestMethod3 ();            foreach (Attribute attr in   type.GetCustomAttributes(false))             {                if (attr.GetType() == typeof(widebright))                 {                    System.Console.WriteLine("testClass 对象具有 widebrihgt这个自定义属性");                }                          }            //测试 widebright”自定义属性“时候存在,获取type的所有方法            foreach (MethodInfo mInfo in type.GetMethods())             {                             foreach (Attribute attr in                     Attribute.GetCustomAttributes(mInfo))                 {                    // Check for the AnimalType attribute.                    if (attr.GetType() == typeof(widebright))                    {                        Console.WriteLine(                            " {0}方法有一个 名字为{1} 的\"widebright\" 属性.",                             mInfo.Name, ((widebright)attr).Name );                           if (((widebright)attr).Name == "test2" )                           {                               //动态调用testClass对象的方法                               mInfo.Invoke(testClass, new string [] {((widebright)attr).Name});                           }                            else                            {                               //第一个方法没有参数,所以传个null给他                               mInfo.Invoke (testClass, null);                            }                    }else{                          Console.WriteLine(                            " {0}方法不具有\"widebright\" 属性.",                             mInfo.Name );                                        }                           }        }      }    }运行程序后将打印:哈哈,第三个测试,name的值为hahaa哈哈,第三个测试,name的值为widebrighttestClass 对象具有 widebrihgt这个自定义属性TestMethod方法有一个 名字为test1 的"widebright" 属性.哈哈,第一个测试通过TestMethod2方法有一个 名字为test2 的"widebright" 属性.哈哈,第二个测试通过,传过来的参数是:test2很有意思用法,呵呵, widebright手记

 

C#中的Attribute和Java中的Annotation