- 注解概念
- @Override 表示重写父类方法
Interface 修饰
@Deperated 表示废弃。过时不建议使用,但是还可以使用。
@SuppressWarnings 表示抑制编译时的警告信息。
添加 @SuppressWarining 后:
多了属性的定义:String[] value(); String[]表示参数类型,value表示参数名称。
自定义注解:
@Traget
Target内部:
ElementType:内部是枚举类型
@Retention 注解的生命周期。
String[] schools() default{“ www”,”aaaa”} ;//数组
使用:
Annotation1:
package com.example.zengjx.myjavabase;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by zengjx on 2019/2/1.
*/
//@Target(ElementType.METHOD)//Merhod 表示只能用在方法前面。
//数组表示可以用于类 方法
@Target(value = {ElementType.METHOD,ElementType.TYPE})
// 可以被反射读取 一般会用RUNTIME
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String StudentName() default ""; //StudentName表示参数名称 default 表示默认值
int age() default 0;
int id() default -1;// -1 表示不存在
String[] schools() default {"1111","2222"};
}
Annotation2:
package com.example.zengjx.myjavabase;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by zengjx on 2019/2/1.
*/
@Target(value = {ElementType.METHOD,ElementType.TYPE})
// 可以被反射读取 一般会用RUNTIME
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation2 {
String value();//如果只用一个参数一般是 value()
}
使用:
package com.example.zengjx.myjavabase;
/**
* Created by zengjx on 2019/2/1.
*/
//使用 ()赋值
@MyAnnotation
public class Demo01 {
@MyAnnotation(age = 112,StudentName = "zeng",id=123,schools = {"ssss","ddddd"})
public void test01(){
}
@MyAnnotation2(value = "一个值")
public void test2(){
}
}
反射读取注解:
一个注解的使用步骤:
- 定义注解
- 在类里面使用这个注解
- 写解析程序读出注解。
定义Filed 注解类:
package com.example.zengjx.myjavabase;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by zengjx on 2019/2/1.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SxtField {
String columName();//列名
String type();//数据类型
int length();//长度
}
定义 SxtTable注解 类
package com.example.zengjx.myjavabase;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by zengjx on 2019/2/1.
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface SxtTable {
String value();
}
使用 SxtStudent 注解
package com.example.zengjx.myjavabase;
/**
* Created by zengjx on 2019/2/1.
*/
@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 getAge() {
return age;
}
public int getId() {
return id;
}
public String getStudentname() {
return studentname;
}
public void setAge(int age) {
this.age = age;
}
public void setId(int id) {
this.id = id;
}
public void setStudentname(String studentname) {
this.studentname = studentname;
}
}
解析类:
package com.example.zengjx.myjavabase;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
/**
* Created by zengjx on 2019/2/1.
*/
public class Demo03 {
public String test(){
String allannotations=null;
try{
//按照完整路径获取类
Class clazz =Class.forName("com.example.zengjx.myjavabase.SxtStudent") ;//完整路径
//获得类的所有注解
Annotation[] annotations= clazz.getAnnotations();
StringBuffer sb=new StringBuffer();
for(Annotation a:annotations){
sb.append(a);
}
allannotations=sb.toString();
}catch (ClassNotFoundException e){
e.getMessage();
}
return allannotations;
}
public void test2(){
//获得类指定注解的值
try {
Class clazz =Class.forName("com.example.zengjx.myjavabase.SxtStudent") ;
SxtTable sxtTable =(SxtTable) clazz.getAnnotation(SxtTable.class);
System.out.println("sxtTable.value()"+sxtTable.value());//sxtTable.value()tb_student
//获得类属性值其中 的 studentname ,id 类似
Field f = clazz.getDeclaredField("studentname");
SxtField sxtField=f.getAnnotation(SxtField.class);
// 获取 studentname :snamevarchar 10
System.out.println("获取 studentname :"+sxtField.columName()+ ""+sxtField.type()+" "+sxtField.length());
}catch (ClassNotFoundException e){
e.getMessage();
}catch (NoSuchFieldException e){
e.getMessage();
}
}
}
junit测试 :
package com.example.zengjx.myjavabase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Created by zengjx on 2019/2/1.
*/
public class Demo03Test {
Demo03 demo03 ;
@Before
public void setUp() throws Exception {
demo03 =new Demo03();
}
@After
public void tearDown() throws Exception {
}
@Test
public void test1() throws Exception {
//反射:@com.example.zengjx.myjavabase.SxtTable(value=tb_student)
String s= demo03.test();
System.out.println("反射:"+s);
}
@Test
public void test2() throws Exception{
demo03.test2();
}
}
输出:1.反射:@com.example.zengjx.myjavabase.SxtTable(value=tb_student)
2. sxtTable.value()tb_student
获取 studentname :sname varchar 10