注解_反射_day_36;

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();
		}
	}
}





猜你喜欢

转载自blog.csdn.net/qq_38053395/article/details/80948228