Java基础加强——注解应用实例加强

注解应用基础加强

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——基于注解的方式也用到了。本文章部分内容摘自齐*老师的文档,在此向老师表达敬意。欢迎大家评论文章,你们的平路和支持是我最大的创作动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值