关于注解的简析
第一次写博客,瞎写
首先,注解是什么?注解和注释有区别吗?
注解就是给自己还有给处理器看的语句。
而注释呢,只能让自己看到,而编译器会忽略掉这些注释
内置注解有三种,
1、@Override也就重写;主要来重写父类里面有的方法;
比如使用很多的重写toString方法:
@Override
public void toString(){
return "";
}
2、@Deprecate,它表示不鼓励使用这些方法的,但是被它提示的方法还是能用。
@Deprecated
public static void test001() {
System.out.println("it run");
}
3、@SuppressWarnings,下压警告,也就是把提示的警告去除,
这些就看不到了。
那么,怎么写注解呢?
注解还有三个元注解
@Target(就是表示编译器需要检查的类型)
有PACKAGE(包)、TYPE(类、枚举、接口)、CONSTRUCTOR(构造器)、FIELD(描述域)、METHOD(方法)、LOCAL_VARIABLE(局部变量)、PARAMETER(参数)
在文件中用@Target(value = ElementType.TYPE)表示
@Retention(表示运行的时候)
所以,打开ecplise的注释;编译Annotation注释文件:
@Target(value = {ElementType.METHOD,ELementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Annotation{
//String Value();正常情况下只有一个值用value();
String studentName() defalut "";
int age() defalut 0;
int id() default -1;//-1表示没有
}
然后在写一个测试的文件demo1
class demo1{
@Annotation(studentName="凡",age = 21,id=1001)
public void test01(){
}
}
这样就了解的注释了,那么现在开始讨论如何让编译器读到你的注释
首先我们写一个student类。一个表格中(tb_student)中有id、sName、age这三种属性,并让编译器检查是看看这些属性是否有正确的格式
1、写一个student类:
public class student{
private int id;
private String studentName;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudengName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
写一个检查表格属性的注解:
@Target(value = {ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface sField{
String colunmName();
String type();
int length();
}
然后开始给student附上注解:
public class student{
@Annotiation(colunmName = "id",type = int,length = 10)
private int id;
@Annotiation(colunmName = "studentName",type = String,length = 10)
private String studentName;
@Annotiation(colunmName = "id",type = int,length = 10)
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getStudentName() {
return studentName;
}
public void setStudengName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
按上面方法检查表格是否是tb_student:
@Target(value = {ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table{
String value();
}
@Table("tb_student")
public class Student {
@sField(colunmName="id",type="int",length=10)
private int id ;
@sField(colunmName="sName",type="varchar",length=10)
private String studentName;
@sField(colunmName="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 setStudengName(String studentName) {
this.studentName = studentName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
OK!
接下来写一个demo3开始测试:
public class Demo03 {
public static void main(String[] args) {
try {
Class clazz = Class.forName("Annotation.Student");//包.类
//获得类的所有注解
Annotation[] annotation = clazz.getAnnotations();
for(Annotation a:annotation){
System.out.println(a);
}
//获得类指定的注解
Table t = (Table)clazz.getAnnotation(Table.class);
System.out.println(t.value());
//获得类的属性的注解
Field f = clazz.getDeclaredField("studentName");
sField sfield = f.getAnnotation(sField.class);
System.out.println(sfield.colunmName()+"--"+sfield.type()+"--"+sfield.length());
} catch (Exception e) {
e.printStackTrace();
}
}
}
按F11运行得结果