java基础系列(三):注解和反射详解
一,java注解
1.什么是java注解?
注解(Annotation)是从jdk5.0引入的技术,可以被其他的程序读取,可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,通过反射机制可以实现对这些元数据的访问。
2.元注解
java定义了4个标准的meta-annotation类型,这些类型和他们所支持的类在java.lang.annotation包中,分别是@Target、@Retention、@Documented、@Inherited。
@Target:描述注解的使用范围(类、方法、字段等)
常用参数类型:1.TYPE::用在类,接口上。
2.FIELD:字段。
3.METHOD:方法。
4.CONSTRUCTOR:构造器上
@Retention: 描述注解的生命周期,在什么级别保存注释信息,参数类型:SOURCE<CLASS<RUNTIME.我们通常使用RUNTIME。
@Documen:说明该注解将被包含在javadoc中。
@Inherited:说明子类可以继承父类中的注解。
3.内置注解
@Override:定义在java.lang.Override中,重写超类中的方法。
@Deprecated:定义在java.lang.Deprecated中,表示不鼓励程序员使用这样的被修饰的元素,但是仍然能使用。
@SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制不同级别编译时的警告信息。
4.自定义注解
使用@interface自定义注解时,自动继承了java.lang.Annotation 接口。
格式 :@interface 注解名{定义内容}
声明参数:参数类型 参数名字() default value; 注解元素必须要有值,不传值则要定义默认值。当注解元素只有一个时,通常使用value();
1 public class Test01 { 2 3 @Annotation1(name="haha") //注意 4 public static void test01(){ 5 System.out.println(123); 6 } 7 8 @Annotation2(name="haha",age=14) 9 public static void test02(){} 10 11 } 12 13 @Target(ElementType.METHOD) 14 @Retention(RetentionPolicy.RUNTIME) 15 @interface Annotation1{ 16 String name() default ""; 17 } 18 19 @Target(ElementType.METHOD) 20 @Retention(RetentionPolicy.RUNTIME) 21 @interface Annotation2{ 22 String name() default ""; 23 int age() default 0; 24 String[] hobby() default {"篮球","王者荣耀"}; 25 }
二,反射原理及代码实现
3.通过反射获取注解信息
实例:将一个对象映射到数据库的一条数据
//1.定义类上注解,
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Tablename{
String value();
}
//2.定义字段上注解
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface Fieldattr{
String name();
String type();
}
//3.定义一个类对象
@Tablename("t_student")
public class Student{
@Fieldattr(name="id",type="int")
public int id;
@Fieldattr(name="name",type="char")
public String name;
@Fieldattr(name="age",type="int")
public int age;
public static void main(String[] args){
//获取class对象
Class c1 = Student.class;
//获取注解
Annotation[] annotations = c1.getAnnotations(); //获取的是注解的全类名
Tablename tablename = (Tablename) c1.getAnnotation(Tablename.class);
System.out.println(tablename.value());//获取注解中参数的值;
Field name = c1.getDeclaredField("name");
Fieldattr fieldattr = (Filedattr)name.getAnnotion(Fieldattr.class);
System.out.println(fieldattr.name());
System.out.println(fieldattr.type());
}
}