什么是注解?
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();
}
}
}