JAVA自定义注解使用

版权声明:本文为博主原创文章 http://blog.csdn.net/su20145104009 https://blog.csdn.net/su20145104009/article/details/52972692

说到注解 在java中我们经常会看到@Override,@Deprecated,@SuppressWarnings这些注解。这些都是JDK自带的注解

关于自定义注解:

1.使用@interface关键字定义注解

2.成员以无参方式声明

3.成员可以使用default指定一个默认值

4.如果只有一个成员  成员名必须为value().使用时 可以忽略=号

元注解:

@Target  表示注解的作作用域。ElementType参数有

  • ElementType.TYPE 类,接口等
  • ElementType.METHOD 方法声明
  • ElementType.CONSTRUCTOR 构造方法声明
  • ElementType.FIELD 字段声明
  • ElementType.LOCAL_VARIABLE 局部变量声明
  • ElementType.PACKAGE 包声明
  • ElementType.PARAMETER 参数声明

@Retention表示注解的声明周期,可能用到的RetentionPolicy参数有

  • RetentionPolicy.SOURCE 源码注解(注解将被编译器丢弃)
  • RetentionPolicy.CLASS 编译时注解(注解在class文件可用,但会被VM丢弃)
  • RetentionPolicy.RUNTIME 运行时注解(运行时保留注解,因此可以使用java反射机制读取注解信息)

@Inherited 允许子类继承父类的注解

@Documented将注解包含在javadoc中

自定义注解实战

项目需求

我们分别为表名和字段名新建注解

Table注解  作用域在类@Target(ElementType.TYPE),生命周期为@Retention(RetentionPolicy.RUNTIME)

package com.susu;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Table {
    String value();
}

Column注解,作用域在字段名@Target(ElementType.FIELD)生命周期为@Retention(RetentionPolicy.RUNTIME)
 
  1. package com.susu;

  2.  
  3. import java.lang.annotation.ElementType;

  4. import java.lang.annotation.Retention;

  5. import java.lang.annotation.RetentionPolicy;

  6. import java.lang.annotation.Target;

  7.  
  8. @Retention(RetentionPolicy.RUNTIME)

  9. @Target(ElementType.FIELD)

  10. public @interface Column {

  11. String value();

  12. }


User实体类。

 
  1. package com.susu;

  2.  
  3. @Table("user")

  4. public class User {

  5. @Column("id")

  6. private int id;

  7. @Column("username")

  8. private String username;

  9. @Column("nickname")

  10. private String nickname;

  11. @Column("age")

  12. private int age;

  13. @Column("gender")

  14. private String gender;

  15. @Column("city")

  16. private String city;

  17. @Column("email")

  18. private String email;

  19. @Column("phoneNumber")

  20. private String phoneNumber;

  21.  
  22. public User() {

  23. super();

  24. // TODO Auto-generated constructor stub

  25. }

  26.  
  27. public int getId() {

  28. return id;

  29. }

  30.  
  31. public void setId(int id) {

  32. this.id = id;

  33. }

  34.  
  35. public String getUsername() {

  36. return username;

  37. }

  38.  
  39. public void setUsername(String username) {

  40. this.username = username;

  41. }

  42.  
  43. public String getNickname() {

  44. return nickname;

  45. }

  46.  
  47. public void setNickname(String nickname) {

  48. this.nickname = nickname;

  49. }

  50.  
  51. public int getAge() {

  52. return age;

  53. }

  54.  
  55. public void setAge(int age) {

  56. this.age = age;

  57. }

  58.  
  59. public String getGender() {

  60. return gender;

  61. }

  62.  
  63. public void setGender(String gender) {

  64. this.gender = gender;

  65. }

  66.  
  67. public String getCity() {

  68. return city;

  69. }

  70.  
  71. public void setCity(String city) {

  72. this.city = city;

  73. }

  74.  
  75. public String getEmail() {

  76. return email;

  77. }

  78.  
  79. public void setEmail(String email) {

  80. this.email = email;

  81. }

  82.  
  83. public String getPhoneNumber() {

  84. return phoneNumber;

  85. }

  86.  
  87. public void setPhoneNumber(String phoneNumber) {

  88. this.phoneNumber = phoneNumber;

  89. }

  90.  
  91. }


下面是测试类

 
  1. package com.susu;

  2.  
  3. import java.lang.reflect.Field;

  4. import java.lang.reflect.Method;

  5.  
  6. public class Test {

  7. public static void main(String[] args) {

  8. User user1=new User();

  9. user1.setNickname("小明");

  10. user1.setAge(10);

  11.  
  12. User user2=new User();

  13. user2.setUsername("张三");

  14. User user3=new User();

  15. user3.setEmail("[email protected]");

  16. user3.setCity("北京");

  17. query(user1);

  18. query(user2);

  19. query(user3);

  20. }

  21.  
  22. @SuppressWarnings({ "rawtypes", "unchecked" })

  23. private static void query(Object obj) {

  24. StringBuilder sb=new StringBuilder();

  25. Class c=obj.getClass();

  26. //如果类不包含@Table注解 结束

  27. if(!c.isAnnotationPresent(Table.class)){

  28. return ;

  29. }

  30. //获得表名

  31. Table table= (Table) c.getAnnotation(Table.class);

  32. sb.append("select * from "+table.value()+" where 1 = 1");

  33. Field fields[]=c.getDeclaredFields();

  34. for (Field field : fields) {

  35. //如果该字段不包含@Column注解 遍历下一个

  36. if(!field.isAnnotationPresent(Column.class)){

  37. continue;

  38. }

  39. //获得字段名

  40.  
  41. Column column=field.getAnnotation(Column.class);

  42. String columnName=column.value();

  43. String fieldName=field.getName();

  44. //获取该字段的get方法

  45. String methodName="get"+fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);

  46. try {

  47. Method method=c.getDeclaredMethod(methodName);

  48. Object o =method.invoke(obj);

  49. if(o==null||(o instanceof Integer&&(Integer)o==0)){

  50. continue;

  51. }

  52. //拼装sql

  53. if(o instanceof String){

  54. sb.append(" and "+columnName+" = '"+o+"'");

  55. }else if(o instanceof Integer){

  56. sb.append(" and "+columnName+" = "+o);

  57. }

  58.  
  59. } catch (Exception e) {

  60. e.printStackTrace();

  61. }

  62. }

  63. System.out.println(sb.toString());

  64. }

  65. }


运行结果:

我们可以使用@Table和@Column这两个注解 对新的表 新的字段进行拼装sql查询语句

比如,新表

 
  1. package com.susu;

  2. @Table("Department")

  3. public class Department {

  4. @Column("id")

  5. private int id;

  6. @Column("leader")

  7. private String leader;

  8. @Column("city")

  9. private String name;

  10. @Column("city")

  11. private String city;

  12. public Department() {

  13. super();

  14. // TODO Auto-generated constructor stub

  15. }

  16. public int getId() {

  17. return id;

  18. }

  19. public void setId(int id) {

  20. this.id = id;

  21. }

  22. public String getLeader() {

  23. return leader;

  24. }

  25. public void setLeader(String leader) {

  26. this.leader = leader;

  27. }

  28. public String getName() {

  29. return name;

  30. }

  31. public void setName(String name) {

  32. this.name = name;

  33. }

  34. public String getCity() {

  35. return city;

  36. }

  37. public void setCity(String city) {

  38. this.city = city;

  39. }

  40.  
  41. }

在测试类里面继续调用

 
  1. Department dep1=new Department();

  2. dep1.setId(5);

  3. dep1.setLeader("张三");

  4. dep1.setCity("上海");

  5. Department dep2=new Department();

  6. dep2.setCity("成都");

  7. query(dep1);

  8. query(dep2);


 

运行结果:

猜你喜欢

转载自blog.csdn.net/huangli1466384630/article/details/82503666