java注解和反射原理_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

@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 classTest01 {2

3 @Annotation1(name="haha") //注意

4 public static voidtest01(){5 System.out.println(123);6 }7

8 @Annotation2(name="haha",age=14)9 public static voidtest02(){}10

11 }12

13 @Target(ElementType.METHOD)14 @Retention(RetentionPolicy.RUNTIME)15 @interfaceAnnotation1{16 String name() default "";17 }18

19 @Target(ElementType.METHOD)20 @Retention(RetentionPolicy.RUNTIME)21 @interfaceAnnotation2{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());

}

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值