(A6,一)java自定义注解

xiaoxiao2021-02-28  20

java自定义注解


什么是注解?

Jdk1.5新增新技术,注解。很多框架为了简化代码,都会提供有些注解。可以理解为插件,是代码级别的插件,在类的方法上写:@XXX,就是在代码上插入了一个插件。 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用。

注解分类:内置注解(也成为元注解 jdk 自带注解)、自定义注解(Spring框架)

什么是内置注解?

例如:

(1) @SuppressWarnings 在程序前面加上可以在javac编译中去除警告 (2) @Deprecated 带有标记的包,方法,字段说明其已过时 (3)@Overricle 打上这个标记说明该方法是将父类的方法重写

@ SuppressWarnings 案例演示

@SuppressWarnings({ "all" }) public void save() { java.util.List list = new ArrayList(); }

@Deprecated 案例演示

new Date().parse("");

@Overricle 案例演示

@Override public String toString() { return null; }

看图:

实现自定义注解

元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。

Java5.0定义的元注解:

@Target

@Target说明了Annotation所修饰的对象范围: Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

1.CONSTRUCTOR:用于描述构造器 2.FIELD:用于描述域 3.LOCAL_VARIABLE:用于描述局部变量 4.METHOD:用于描述方法 5.PACKAGE:用于描述包 6.PARAMETER:用于描述参数 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention

表示需要在什么级别保存该注释信息,用于描述注解的生命周期 (即:被描述的注解在什么范围内有效)

@Documented
@Inherited

代码演示:

使用@interface 定义注解。

@Target(value={ElementType.METHOD,ElementType.FIELD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @interface myAnnotation{ //注意是int类型 int myId() default 0; //有default,代表这个参数可选 String myName() default ""; //没有default,则代表使用注解时,这个参数必写 String [] myArrays(); }

使用自己定义的注解:

/** * TYPE:用于描述类、接口(包括注解类型) 或enum声明 */ @myAnnotation(myId=1,myName="wangyongsheng",myArrays={"23","24"}) public class Test002 { /** * FIELD:用于描述域 */ @myAnnotation(myName="dasheng",myArrays={"23","24"}) public String name; /** * METHOD:用于描述方法 */ @myAnnotation(myId=1,myArrays={"23","24"}) public void add(){ } }

自定义实现ORM框架映射

手动完成案例,ORM框架实体类与表字段不一致,底层生成sql语句原理。 看下图:

自定义表映射注解

/** *myTable注解 */ @Target(value=ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @interface myTable{ String value(); } /** *myProperty注解 */ @Retention(RetentionPolicy.RUNTIME) @Target(value=ElementType.FIELD) @interface myProperty{ String value(); //有default,代表这个参数可选 int length() default 10; } /** *MyStudent实体类 *开始使用上面自定义的注解 */ @myTable(value="itmayiedu_student") class MyStudent{ @myProperty(value="student_id",length=8) public String StudentId; @myProperty(value="student_name") public String StudentName; @myProperty(value="student_age") public String StudentAge; } public class CustomORM { public static void main(String[] args) throws ClassNotFoundException { //获取实体类的class地址 Class<?> forName = Class.forName("com.wangys.CustomAnnotation.MyStudent"); //定义一个拼接字符串 StringBuffer sb=new StringBuffer(); sb.append(" select "); //获取参数名 Field[] declaredFields = forName.getDeclaredFields(); //遍历获取 for(int i=0;i<declaredFields.length;i++){ Field field = declaredFields[i]; myProperty annotation = field.getAnnotation(myProperty.class); //字段名称 String propertyName = annotation.value(); sb.append(" "+propertyName); if(i<declaredFields.length-1){ sb.append(" ,"); } } myTable declaredAnnotation = forName.getDeclaredAnnotation(myTable.class); //表的名称 String tableName=declaredAnnotation.value(); sb.append(" from "+tableName); System.out.println(sb.toString()); } }

运行结果:

转载请注明原文地址: https://www.6miu.com/read-2299967.html

最新回复(0)