PoeticalJustice

导航

注解 如何自定义注解 注解的解析

什么是注解?

package com.bjsxt.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解的作用
 * 1.可以解释程序含义
 * 2.被其他程序使用
 * 注解的格式:
 * "@注解名" 还可以加参数值 
 * 比如
 * @Override 注解 首字母大写 表示重写父类方法
 * @Deprecated 废弃的 过时的 不建议使用的
 * @SuppressWarnings(value="unchecked")
 * 自定义注解:
 * @Target(value={ElementType.METHOD,ElementType.TYPE})
 * 可以看源文件  TYPE类型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
 * @Retention(RetentionPolicy.RUNTIME)自定义一般都选 runtime 
 * @Retention 保留  三个 范围  source源文件  class字节码文件 一般变压器用前面2个                     runtime 运行时(通过反射读取)一般自定义用它
 * 
 * 注解在哪使用?
 * 可以在package,class,mthod,field等 相等于加了辅助信息   我们可以通过反射机制实现对这些元数据的访问
 * @author Administrator
 *
 */
public class TestAnnotation {
    @Override
    //注解 首字母大写 表示重写父类方法
    public String toString(){
        return "";
    }
    @Deprecated
    //废弃的 过时的 不建议使用的
    public static void test001(){
         System.out.println("ok");
    }
    public static void main(String[] args) {
        //虽然是不建议使用 但是可以使用
        test001();
    }
    @SuppressWarnings("all")
    //忽略 警告
    public static void test002(){
        
        
    }
}

如何自定义注解

package com.bjsxt.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 * 元注解 :对注解进行解释
 * 注解的作用
 * 1.可以解释程序含义
 * 2.被其他程序使用
 * 注解的格式:
 * "@注解名" 还可以加参数值 
 * 比如
 * @SuppressWarnings(value="unchecked")
 * @Target  注解的作用范围(可以修饰包,    类。接口,枚举      方法   成员变量    局部变量    参数)
 * @Target(value={ElementType.METHOD,ElementType.TYPE})
 * 可以看源文件  TYPE类型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
 * @Retention(RetentionPolicy.RUNTIME)自定义一般都选 runtime 
 * @Retention 保留  三个 范围  source源文件  class字节码文件 一般变压器用前面2个                     runtime 运行时(通过反射读取)一般自定义用它
 * 
 * 注解在哪使用?
 * 可以在package,class,mthod,field等 相等于加了辅助信息   我们可以通过反射机制实现对这些元数据的访问
 * 
 * @author Administrator
 *
 */
@Target(value={ElementType.METHOD,ElementType.TYPE})
//可以看源文件  ElementType.METHOD方法    ElementType.TYPE型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
@Retention(RetentionPolicy.RUNTIME)
//自定义注解一般都选 runtime 
public @interface MyAnnotation01 {
    //参数信息  参数类型 参数名
    //注解元素必须要有值 可以设置 默认返回值
    String studentName() default "";
    int age() default 0;
    int id() default -1;//-1表示不存在
    
    
    String[]schools()default{"清华","北大"};
            
}
package com.bjsxt.annotation;
/**
 * 使用我们自定义的注解
 * @author Administrator
 *
 */
@MyAnnotation01
public class MyAnnotation01Test {
    @MyAnnotation01(age=19,studentName="老哥",id=1001,schools={"人大","北电"})
    public void test(){
        
    }
}

什么是ORM

package com.bjsxt.annotation.orm;
/**
 *  * ORM(Object Ralationship Mapping)
 * 关系型数据库
 * 类和表结构对应 属性和字段对应  对象和记录对应
 * @author Administrator
 *
 */

@SxtTable("tb_student")
public class SxtStudent {
    
    @SxtField(columName="id",type="int",length=10)
    private int id;
    @SxtField(columName="sname",type="varchar",length=10)
    private String studentName;
    @SxtField(columName="age",type="int",length=3)
    private int age;
    
    
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getStudentName() {
        return studentName;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
package com.bjsxt.annotation.orm;
/**
 * 自定义注解table
 * 
 * 
 * ORM(Object Ralationship Mapping)
 * 关系型数据库
 * 类和表结构对应 属性和字段对应  对象和记录对应
 * 
 * 1.定义注解
 * 2.在类中使用注解
 * 3.解析注解
 */
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value={ElementType.TYPE})
//可以看源文件  ElementType.METHOD方法    ElementType.TYPE型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
@Retention(RetentionPolicy.RUNTIME)
//自定义注解一般都选 runtime 
public @interface SxtTable {
    String value();

}
package com.bjsxt.annotation.orm;
/**
 *  * ORM(Object Ralationship Mapping)
 * 关系型数据库
 * 类和表结构对应 属性和字段对应  对象和记录对应
 * 
 * 自定义注解 
 * field属性
 */

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(value={ElementType.FIELD})
//可以看源文件  ElementType.METHOD方法    ElementType.TYPE型里面是枚举类型 里面 有 类 包  成员变量 局部变量 等等类型 可以理解为全部类型
@Retention(RetentionPolicy.RUNTIME)
//自定义注解一般都选 runtime 
public @interface SxtField {
    // 表的字段名
    String columName();
    String type();
    int length();

}
package com.bjsxt.annotation.orm;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Iterator;


/**
 * 使用反射读取注解的信息 模拟处理注解信息的流程
 * @author Administrator
 *
 * * ORM(Object Ralationship Mapping)
 * 关系型数据库
 * 类和表结构对应 属性和字段对应  对象和记录对应
 */

public class Demo03 {
    public static void main(String[] args) {
        try {
            //获得该包下这个类所有信息
            Class clazz=Class.forName("com.bjsxt.annotation.SxtStudent");
            //获得该类的所有注解
            Annotation[]annotation = clazz.getAnnotations();
            
            for (Annotation a: annotation ) {
                System.out.println(a);
                
            }
            //获取类的指定注解           根据注解名获取注解
            SxtTable st =(SxtTable) clazz.getAnnotation(SxtTable.class);    
            
            System.out.println(st.value());
            //获得类的属性的注解
            Field f = clazz.getDeclaredField("studentName");
            SxtField sxtField = f.getAnnotation(SxtField.class);
            System.out.println(sxtField.columName()+"--"+sxtField.type()+"--"+sxtField.length());
            //跟着获得的表名 字段信息 拼出DDl语句 然后,使用JDBC执行这个sql在数据库 生成先关的表
        } catch (Exception e) {
            
            e.printStackTrace();
        }
        
        
    }
}

 

posted on 2017-10-16 18:55  PoeticalJustice  阅读(9104)  评论(0编辑  收藏  举报