全面解析注解

    为什么要学习注解,学习注解有什么好处,学完能做什么?

  1,能够读懂别人写的代码,特别是框架中的相关的代码。

  2,让编程更加简洁,代码更加清晰

  概念自己百度

  java中常见的注解

         ~常见注解(JDK注解)

      

package 注解;

public interface Person {

	public String name();
	public int age();
	
	@Deprecated//表示这个类中的方法已经过时了
	public void sing();
	
}




package 注解;

public class Child implements Person{

	@Override
	public String name() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int age() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void sing() {
		// TODO Auto-generated method stub
		
	}

}


package 注解;

public class MainTest {

	@SuppressWarnings("deprecation")
	public void sing(){
		Person p = new Child();
		//虽然这个方法过时了,但是我要用这个方法,我就要添加注解
		
		p.sing();
	}
	
	public static void main(String[] args) {
		
	}
	
}

  常见的第三方注解

    ~Spring中的注解{@Autowired,@Service,@Repository};MyBatis中的注解{@InsertProvider,@UpdateProvider,@Options};

        

public class UserMangerImpl implements UserManger{
    private UserDao userDao;
    public void setUserDao(UserDao userDao){
            this.userDao = userDao;
    }

}    
用XML文件配置
//配置文件
<bean id="userMangerImpl" class="com.ss.spring.annotion.service.UserMangerImpl">
       <property name="userDao" ref="userDao"/>
</bean>

<bean id="userDao" class="com.ss.spring.annotion.persistence.UserMangerDaoImpl">
       <property name="sessionFactory" ref="mySessionFactory"/>
</bean>


//注解 引入Autowired

public class UserMangerImpl implements UserManger{
      @Autowired
      private UserDao userDao;
    
}  

  ~注解分类

    源码注解

           编译注解

           运行注解

  ~自定义注解

    语法:

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)//生命周期
@Inherited//允许子类继承
@Documented//生成javadoc带有注解信息
public @interface Description{
     String desc();//成员无参无异常的声明方式
     String author()
     int age() default 18;//可以用default为成员指定一个默认值  

}

  定义注解的时候,成员类型是受限制的,合法的类型有原始类型及String,Class,Annotation,Enumeration.

  如果注解只有一个成员,成员的名称必须取名是value(),在使用的时候可以忽略成员名和复制号(=)

  使用注解的语法:

  @<注解名>(<成员名1>=<成员值1>,<成员名2>=<成员值2>)

      比如:@Description(desc="i am tom",author="boy",age=18)

              public String eyeColor(){

        return "red";

     }

  ~解析注解

    

package 注解;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Parse {

	public static void main(String[] args) {
		//1使用类加载器加载类
		try {
			Class c = Class.forName("注解.Child");
			//2找到类上面的注解
			boolean isExit = c.isAnnotationPresent(Description.class);
			if (isExit) {
				//3拿到注解实例
				Description description =(Description)c.getAnnotation(Description.class);
				System.out.println(description);
			
			
			}
			
			//找到方法上的注解
			Method[] ms = c.getMethods();
			
			for (Method m:ms) {
				boolean isMethodExit = m.isAnnotationPresent(Description.class);
				if (isMethodExit) {
					//3拿到注解实例
					Description description =(Description)m.getAnnotation(Description.class);
					System.out.println(description);
				
				
				}
			}
			//另一种解析方法
			for (Method m:ms) {
				Annotation[] as = m.getAnnotations();
				for (Annotation a:as) {
					if (a instanceof Description) {
						Description description =(Description)a;
						System.out.println(description.value());
					}
				}
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}

  继承的测试

package 注解;
@Description("i am interfacer")
public class Person {
	@Description("i am interface method")
	public String name(){
		return null;
	}
	public int age(){
		return 0;
	}
	
	@Deprecated//表示这个类中的方法已经过时了
	public void sing(){
		
	}
	
}


package 注解;

public class Child extends Person{


	public String name() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int age() {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public void sing() {
		// TODO Auto-generated method stub
		
	}

}


package 注解;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

public class Parse {

	public static void main(String[] args) {
		//1使用类加载器加载类
		try {
			Class c = Class.forName("注解.Child");
			//2找到类上面的注解
			boolean isExit = c.isAnnotationPresent(Description.class);
			if (isExit) {
				//3拿到注解实例
				Description description =(Description)c.getAnnotation(Description.class);
				System.out.println(description);
			
			
			}
			
			//找到方法上的注解
			Method[] ms = c.getMethods();
			
			for (Method m:ms) {
				boolean isMethodExit = m.isAnnotationPresent(Description.class);
				if (isMethodExit) {
					//3拿到注解实例
					Description description =(Description)m.getAnnotation(Description.class);
					System.out.println(description);
				
				
				}
			}
			//另一种解析方法
			for (Method m:ms) {
				Annotation[] as = m.getAnnotations();
				for (Annotation a:as) {
					if (a instanceof Description) {
						Description description =(Description)a;
						System.out.println(description.value());
					}
				}
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
}


结果:@注解.Description(value=i am interfacer)

      *注解实战

                         需求:有一张用户表,字段包括用户的id,用户名,昵称,年龄,性别,所在城市,邮箱,手机号

                                 方便的对每一个字段或者字段的组合条件进行检索并打印SQL.

                                 

package com.zifeng.bean;

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


package com.zifeng.bean;

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 Column {

	String value();
	
}

package com.zifeng.bean;

@Table("user")
public class Filter {

	@Column("id")
	private int id;
	@Column("user_name")
	private String userName;
	@Column("user_nick")
	private String nickName;
	@Column("age")
	private int age;
	@Column("user_city")
	private String city;
	@Column("user_email")
	private String email;
	@Column("user_monile")
	private String mobile;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getNickName() {
		return nickName;
	}
	public void setNickName(String nickName) {
		this.nickName = nickName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Filter [id=");
		builder.append(id);
		builder.append(", userName=");
		builder.append(userName);
		builder.append(", nickName=");
		builder.append(nickName);
		builder.append(", age=");
		builder.append(age);
		builder.append(", city=");
		builder.append(city);
		builder.append(", email=");
		builder.append(email);
		builder.append(", mobile=");
		builder.append(mobile);
		builder.append("]");
		return builder.toString();
	}
	
	
	
}


package com.zifeng.bean;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test {

	public static void main(String[] args) {
		Filter f1 = new Filter();
		f1.setId(8);//查询id为8的用户
		
		Filter f2 = new Filter();
		
		f2.setUserName("Tom");
		
		Filter f3 = new Filter();
		
		f3.setEmail("liu@sina.com");
		
		String sql1 = query(f1);
		String sql2 = query(f2);
		String sql3 = query(f3);
		
		System.out.println(sql1);
		System.out.println(sql2);
		System.out.println(sql3);
	}

	private static String query(Filter f) {
		StringBuffer sb = new StringBuffer();
		//获取class
		Class c = f.getClass();
		//获取table的名称
		boolean exists = c.isAnnotationPresent(Table.class);
		if (!exists) {
			return null;
		}
		
		Table t = (Table)c.getAnnotation(Table.class);
		String tableName = t.value();
		sb.append("select * from ").append(tableName).append(" where 1=1");
		//遍历所有的字段
		Field[] fArray = c.getDeclaredFields();
		
		for (Field field:fArray) {
			//处理每个字段对应的sql
			
			//拿到字段的名
			boolean fExsist = field.isAnnotationPresent(Column.class);
			
			if (!fExsist) {
				continue;
			}
			
			Column column = field.getAnnotation(Column.class);
			String columnName = column.value();
			//拿到字段的值
			 Object fieldValue = "";
			String filedName = field.getName();
			String getMethodName = "get"+filedName.substring(0,1).toUpperCase()+filedName.substring(1);
			try {
				Method getMethod = c.getMethod(getMethodName);
				
			     fieldValue = (Object)getMethod.invoke(f);
			
			} catch (Exception e) {
				
				e.printStackTrace();
			} 
			
			//拼接sql
			
			if (fieldValue == null || (fieldValue instanceof Integer && (Integer) fieldValue == 0)) {
				continue;
			}
			sb.append(" and ").append(filedName);
			if (fieldValue instanceof String) {
				
				if (((String) fieldValue).contains(",")) {
					String[] values = ((String) fieldValue).split(",");
					sb.append(" in(");
					for (String v:values) {
						
						sb.append("'");
						sb.append(v).append("'").append(",");
						
						
					}
					sb.deleteCharAt(sb.length()-1);
					sb.append(")");
				} else {
					sb.append(" = ").append("'").append(fieldValue).append("'");
				}
				
				
			} else if (fieldValue instanceof Integer){
				sb.append(" = ").append(fieldValue);
			}
			
			
		}
		
		return sb.toString();
	}
	
}

执行的结果是:

select * from user where 1=1 and id = 8
select * from user where 1=1 and userName = 'Tom'
select * from user where 1=1 and email = 'liu@sina.com'

用注解很方便生成sql语句,生成各种表的sql语句,你只需要改变一下bean实体就行了。

  

  

        

原文地址:https://www.cnblogs.com/airycode/p/4822756.html