Unit 1 : 注解
Topic One:什么是注解
注意:注释是comment;
Topic Two:几种内置注解
这个方法的上面就有这个 他的意思是不建议使用;
注意:直接使用all可以压制全部,你也可以对应的研制;
代码如下:
package Test;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
*
* 测试一下Annotation的作用
*
* @author Wang
*
*/
public class Demo01 {
@Override //重写
public String toString(){
return "";
}
@Deprecated //不建议使用的方法
public static int add(int a ,int b){
return a+b;
}
@SuppressWarnings("all")//压制警告的作用
public static void test(){
List L1 = new ArrayList();
}
@SuppressWarnings("all")
public static void main(String[] args){
Date a = new Date();
System.out.println(add(3,4));//我们可以看见我们在使用不建议使用的方法的时候 方法的上面会有一个横线;
}
}
Topic Three:自定义注解
我们在定义注解的时候需要先定义元注解:
元注解的作用就是说明注解的使用范围等等 的解释;
Target:来描述注解的使用范围:
元注解Retention:
自己定义的一个注解:
package Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* 自定义一个自己的注解
*
* @author wangtong
*
*/
@Target(value={ElementType.METHOD,ElementType.TYPE})
//这一行的作用是 规定这个注解可以用于方法和Type(Type的类,接口,枚举等等)的前面
@Retention(RetentionPolicy.RUNTIME)
//这个元注解的作用就是使我们写的那个注解 保存为运行时有效
public @interface MyAnnotation {
//我们可以给注解添加参数列表,但是如果我们在添加参数后如果不写默认值的话
//那么我们在用注解的时候就要添加上去
String studentName() default "";
int age() default 0;
int id() default -1; //String indexOf("abc") -1
// -1的作用在这里是不存在
String[] schools() default {"清华大学","北京大学"};
}
测试自己写的这个注解:
package Test;
/**
*
* 测试自己写的注解
*
* @author wangtong
*
*/
@MyAnnotation
//可以修饰类 这里没有对注解的参数进行复制 那这里使用的就是默认值
public class Demo02 {
//可以修饰方法 这里我们自己就给参数就行赋值了
@MyAnnotation(age=19,studentName="啊哈",id=1,
schools={"北京大学","南阳理工"})
public void test(){
}
}
Unit 2: 反射机制读取注解
在这里我们可以看出注解的真正的作用;
我们通过注解可以把对应的Sql的语句跟写进去;
然后我们根据反射来把注解给读出来这样我们我可以得到Sql语句进而得到那个表格;
说白了就我们Java和数据库的结合;
Topic 1:我们来完成尚学堂的这个作业
step 1:先写注解
我们可以明显的看出我们应该写一个Table的注解 来存放表的名字
然后我们应该写一个属性的注解
代码如下:
package Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* 表的注解,这里只有一个表的名字
*
* @author Wang
*
*/
@Target(value={ElementType.METHOD,ElementType.TYPE})
//这一行的作用是 规定这个注解可以用于方法和Type(Type的类,接口,枚举等等)的前面
@Retention(RetentionPolicy.RUNTIME)
//这个元注解的作用就是使我们写的那个注解 保存为运行时有效
public @interface Table {
String value();
//当注解只有一个参数的时候我们把这个参数命名为value
}
package Test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
*
* 属性的注解
*
* @author wangtong
*
*/
@Target(value={ElementType.METHOD,ElementType.TYPE})
//这一行的作用是 规定这个注解可以用于方法和Type(Type的类,接口,枚举等等)的前面
@Retention(RetentionPolicy.RUNTIME)
//这个元注解的作用就是使我们写的那个注解 保存为运行时有效
public @interface Filed {
String columnName();//列名
String type(); //类型
int length(); //长度
}
step 2 : 我们利用类来存放表的信息,利用注解来存放来转化为数据库语言的信息;
package Test;
/**
*
* student类来存放信息;
* 注解来存放数据库语言的信息
*
* @author wangtong
*
*/
@Table("tb_student")
public class Student {
@Filed(columnName = "id" , type = "int" , length = 10)
private int id;
//这里我们带上注解 就可以很容易的利用反射来读取注解的内容 便于转化为数据库语言
@Filed(columnName = "sname" , type = "varchar" , length = 10)
private String sname;
@Filed(columnName = "age" , type = "int" , length = 3)
private int age;
public Student(int id, String sname, int age) {
super();
this.id = id;
this.sname = sname;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
step3 : 利用反射来把注解里面的内容给转化成信息(用于数据库的编写)
package Test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
/**
*
* 我们利用反射来读取信息
*
* @author Wang
*
*/
public class Demo03 {
public static void main(String[] args){
try {
//我们这里读取student的信息 注意这里关联的时候 只要包名和类名就好了
Class classInfo = Class.forName("Test.Student");
//获得类的所有有效注解
Annotation[] annotations=classInfo.getAnnotations();
//用增强for 遍历打印
for (Annotation a : annotations)
System.out.println(a);
//获得类的指定的注解
//关联了Table这个注解类
Table t = (Table) classInfo.getAnnotation(Table.class);
System.out.println(t.value());
//获得类的属性的注解
Field f = classInfo.getDeclaredField("sname");
MyField Field1 = f.getAnnotation(MyField.class);
System.out.println(Field1.columnName()+"--"+Field1.type()+"--"+Field1.length());
//根据获得的表名、字段的信息,拼出DDL语句,然后,使用JDBC执行这个SQL,
//在数据库中生成相关的表
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}