/***********注解声明***************/ /** * 水果名称注解 * @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手记
时间: 2024-10-14 00:41:11