码迷,mamicode.com
首页 > 编程语言 > 详细

C#中的Attribute和Java中的Annotation

时间:2014-09-19 08:48:25      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   使用   java   ar   for   

/***********注解声明***************/

/**
 * 水果名称注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
    String value() default "";
}

/**
 * 水果颜色注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
    /**
     * 颜色枚举
     * @author peida
     *
     */
    public enum Color{ BULE,RED,GREEN};
    
    /**
     * 颜色属性
     * @return
     */
    Color fruitColor() default Color.GREEN;

}

/**
 * 水果供应者注解
 * @author peida
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @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的值为widebright
testClass 对象具有 widebrihgt这个自定义属性
TestMethod方法有一个 名字为test1 的"widebright" 属性.
哈哈,第一个测试通过
TestMethod2方法有一个 名字为test2 的"widebright" 属性.
哈哈,第二个测试通过,传过来的参数是:test2
很有意思用法,呵呵, widebright手记

 

C#中的Attribute和Java中的Annotation

标签:style   blog   color   io   os   使用   java   ar   for   

原文地址:http://www.cnblogs.com/zuiyirenjian/p/3980608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!