用一个简单例子,做一下自定义注解:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
*
*
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
public String hello() default "lzyer";
public String world();
}
Retention:表示注解保留时间和注释类型是否被保留,如果没有Retention注解的声明,是默认的RetentionPolicy.CLASS.
从API文档中可以知道RententionPolicy是枚举类型,取值可以为CLASS,RUNTIME,SOURCE.
CLASS:表示的是这种注解在编译时,会保存在.class文件中,JVM在运行时不会被保存
RUNTIME:表示在编译时这种注解会保存在.class文件中,在运行时保存在JVM中,因此可以通过反射的方式调用。
SOURCE:表示在编译的时候该注解会被丢弃。
测试类:
@MyAnnotation(hello = "beijing", world = "shanghai")
public class MyTest
{
@MyAnnotation(hello="hunan", world="changsha")
@Deprecated
@SuppressWarnings("unchecked")
public void print()
{
System.out.println("hello world");
}
}
反射测试类:
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class Myflection
{
public static void main(String[] args)throws Exception
{
MyTest myTest = new MyTest();
Class classType = MyTest.class;
Method method = classType.getMethod("print", new Class[]{});
//查看某个方法是否存在该注解
if(method.isAnnotationPresent(MyAnnotation.class))
{
MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
String hello = myAnnotation.hello();
String world = myAnnotation.world();
System.out.println(hello +", " +world);
}
//得到方法的所有注解,并遍历
Annotation[] annotations = method.getAnnotations();
for(Annotation a : annotations)
{
System.out.println(a);
}
}
}
结果:
应用:
要返回的List中存放的实体类型中字段与sql查出来的字段无需完全匹配,字段多了少了都不影响,sql中查询出来的字段能与实体中的属性中get方法内的@Column中的name属性对应上即可。
/**
* 根据传入sql以及返回值的类型
* @param sql:需要执行查询的sql语句
* @param clas:实体类型(例如:MyEntity.class)
* @return
* @throws Exception
*/
public static List findBySql(String sql, Class clas) throws Exception {
List list = new ArrayList();
SystemService systemService = (SystemService)SpringTool.getBean("systemService");
List