java自定义注解及实例
目录
说明
内容主要是如何自定义注解(可以配合反射使用)
项目结构
图片:
注解定义
,代码片
.
package 注解;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//作用域
@Target({
ElementType.CONSTRUCTOR,//构造方法
ElementType.FIELD,//字段
ElementType.LOCAL_VARIABLE,//局部变量
ElementType.METHOD,//方法
ElementType.PACKAGE,//包
ElementType.PARAMETER,//参数
ElementType.TYPE//类、接口
})
//生命周期(三选一)
@Retention(
/* RetentionPolicy.SOURCE,//源码
RetentionPolicy.CLASS,//编译
*/
RetentionPolicy.RUNTIME//运行时
)
//是否允许继承,有此注解就允许子类继承父类上的注解(只能在类上)
@Inherited
//生成文件javadoc,会包含注解
@Documented
public @interface 注解名 {
//定义注解成员,无参,无异常
//成员类型只能是基本类型+String+Class+Annotation+Enumeration
//当成员只有一个时,名字只能是value(),在使用时可以不指定成员名。
String deac();
String author();
int age() default 18;//初始化成员的值
}
说明:
有五个部分
自定义表注解@Table>>Table.java
,代码片
.
package 注解;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//定义用在类上的运行时的表格注解
//只有一个成员
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
自定义字段注解@Field>>Field.java
,代码片
.
package 注解;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//定义用在类属性上的运行时的属性注解
//只有一个成员
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Field {
String value();
}
实体类User.java
,代码片
.
package entity;
import 注解.Field;
import 注解.Table;
//实体类
@Table("user")
public class User {
@Field("id")
private int id;
@Field("name")
private String name;
@Field("password")
private String password;
public User(int id, String name, String password) {
this.id=id;
this.name=name;
this.password=password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", password=" + password + "]";
}
}
测试方法dao_text.java
使用注解+反射机制完成实体对象和表的映射,类似hibernate注解,代码片
.
package DAO;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import entity.User;
import 注解.Table;
public class dao_text {
public static void main(String[] args) {
User user=new User(1,"小明","123");
System.out.println(user.toString());
//用注解实现,写出插入数据库的SQL语句
//用反射机制获取user字段上的注解值,组成一个SQL语句
Class<? extends User> c=user.getClass();//获得user类对象,是属于user的类对象
boolean b=c.isAnnotationPresent(Table.class);//判断c上是否有注解@Table
if(!b){
return;
}
Table table=(Table) c.getAnnotation(Table.class);//获得注解实例
String tableName=table.value();//获得注解值---表名
System.out.println(">表名"+tableName);
Field[] fields=c.getDeclaredFields();//获得c上的所以字段
for(Field f :fields){
boolean bf=f.isAnnotationPresent(注解.Field.class);//判断字段上是否有注解Field
if(!bf){
continue;
}
注解.Field fie=f.getAnnotation(注解.Field.class);//获得注解实例
String fieName=fie.value();//获得注解值--表字段名
String fieldName=f.getName();//获得字段名
String getName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);//获得字段的get方法名
Object fieldValue=null;
try {
Method method=c.getMethod(getName);//获得字段get方法对象
fieldValue=method.invoke(user);//执行方法,获得字段值
System.out.print(">>>属性名:"+fieldName+";表字段名:"+fieName+";属性值/-/表字段值:"+fieldValue);
if(fieldValue instanceof String){
System.out.println(";值是字符串类型的");
}else if (fieldValue instanceof Integer) {
System.out.println(";值是int类型的");
}
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
总结
1. 注解可以很好的简化编程。
2. 注解可以用于传值。
3. 注解配合反射机制,力量无穷啊。
**引用包是最大的困难(一步一步来)**