注解应用基础加强
1.如何理解注解(Annotation):
注解是:
1)JDK1.5推出的一种新的应用类型(特殊的class)
2)元数据(Meta Data):一种描述性类型,用于描述对象.例如@Override
2.注解(Annotation)应用场景:
1)描述类及其成员(属性,方法):例如@Override,@Controller
2)替换项目中xml方式对相关对象的描述,例如
3.注解(Annotation)的定义及应用
在实际项目注解可能由第三方定义,也可能会由我们自己定义.自己如何定义呢?
可以借助**@interface**关键字进行定义,例如Override注解的应用
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override{}
其中:
1)@Target 用于描述定义的注解能够修饰的对象。
2)@Retention 用于描述定义的注解何时有效。
案例实现–01:
1.定义注解Entity
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)//表示只能描述类
@interface Entity{}
2.定义注解 ID
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)//表示只能描述属性
@interface ID{}
3.使用注解描述类及成员
@Entity
class SysLog{
@ID
private Integer id;
}
测试代码实现:
public class TestAnnotation01 {
public static void main(String[] args)
throws Exception{
//1.判定SysLog类上是否有Entity注解
Class<?> c1=SysLog.class;
boolean flag = c1.isAnnotationPresent(Entity.class);
System.out.println(flag);
//2.判定SysLog对象中id属性上是否有ID注解
//2.1获取属性id
Field f1 = c1.getDeclaredField("id");
//2.2判定属性上是否有ID注解
flag=f1.isAnnotationPresent(ID.class);
System.out.println(flag);
}
}
案例分析-02:通过反射获取类上的注解以及注解对应的信息
1.定义注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Service{
/**注解中的属性定义*/
String value() default "";
boolean lazy() default true;
}
2.使用注解描述指定的类
@Service(value="userService",lazy=false)
class DefaultSearchService{}
编写业务测试类:获取DefaultSearchService中的注解信息
public class TestAnnotation01 {
public static void main(String[] args) {
//如何获取类或属性等上面注解呢?
//1.获取字节码对象(入口)
Class<?> cls=DefaultSearchService.class;
//2.获取类上的注解
Service service=
cls.getDeclaredAnnotation(Service.class);
//3.获取Entity注解上的内容
String value=service.value();
boolean lazy=service.lazy();
System.out.println(value);
System.out.println(lazy);
}
}
案例分析–03
1.基于注解中定义的包名获取指定路径下的类.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface ComponentScan{
String value();
}
2.定义配置类
@ComponentScan("com.java.annotation")
class AppConfig{}
测试业务实现:
public class TestAnnotation03 {
public static void main(String[] args) {
//1.获取AppConfig类上的@ComponentScan注解
Class<?> c= AppConfig.class;
ComponentScan cs=
c.getDeclaredAnnotation(ComponentScan.class);
//2.获取 @ComponentScan注解中value属性的值
String pkg=cs.value();
System.out.println(pkg);
//3.获取value属性对应包下的所有类
String pkgDir=pkg.replace(".", "/");
System.out.println(pkgDir);
//获取对应目录的的资源路径
URL url=
ClassLoader.getSystemResource(pkgDir);
System.out.println(url.getPath());
File file=new File(url.getPath());
File[] fs=file.listFiles();
for(File f:fs) {
System.out.println(f.getName());
}
}
}
4.个人总结
注解其实并不难理解,自定义注解就是元注解组合在一起的注解。可以好好看下案例分析03,本人在手写spring——基于注解的方式也用到了。本文章部分内容摘自齐*老师的文档,在此向老师表达敬意。欢迎大家评论文章,你们的平路和支持是我最大的创作动力。