首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。