注解
注解的定义
//定义属性 @interface myAnnotation{ int age(); String name(); }
注解的使用
//注解的作用目标 //一般用在类,方法,构造器,参数,局部变量,前 @MyAnno1 public class Demo1 { @MyAnno1 private String name; @MyAnno1 public Demo1() { } @MyAnno1 public void fun1() { } public void fun2(@MyAnno1 String name) { @MyAnno1 String username = "hello"; } }
//对于定义了属性的注解的使用 @MyAnnotation(age=32,name="sma") public class demo{ }
注解属性的类型
只能是
/* > 8种基本类型 > String > Enum > Class > 注解类型 > 以上类型的一维数组类型 */
注解的额外内容
1.默认值
@interface MyAnno2 { int age() default 100; String name(); }
使用时,该属性可以不赋值。
2.value属性。
注解有一个属性名称可以叫value,使用注解是,可以省略value=
3.作用范围限定
在定义注解前加上,比如
//限定注解MyAnno1只能在类,方法和成员变量前使用 @Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD}) @interface MyAnno1 { }
4保留策略
@Retention(RetentionPolicy.RUNTIME) @interface MyAnno1 { }
枚举RetentionPolicy有SOURCE,CLASS,RUNTIME,分别说明注解会保留在其中。
注意:要反射注解,只有使用RUNTIME。
反射注解
//反射泛型 abstract class A<T>{ public A(){ } } class B extentds A<String>{ } // 现在在其他某处使用类B,B b=new B(),想知道父类泛型具体是什么类。 在A的构造函数加入如下代码,具体执行在new B()时进行 Class clazz = this.getClass();//得到子类的类型 Type type = clazz.getGenericSuperclass();//获取传递给父类参数化类型 ParameterizedType pType = (ParameterizedType) type;//它就是A<String> Type[] types = pType.getActualTypeArguments();//它就是一个Class数组 Class c = (Class)types[0];//它就是String //可以连在一起写成 // Class c = (Class)((ParameterizedType)this.getClass() // .getGenericSuperclass()).getActualTypeArguments()[0]; // // System.out.println(c.getName());