博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA注解引发的思考
阅读量:5914 次
发布时间:2019-06-19

本文共 2913 字,大约阅读时间需要 9 分钟。

      自从JDK5开始Java开始增加了对元数据(MetaData)的支持,也就是注解(Annotation),到JDK7时已经有四种基本注解,新增加了一种@SafeVarargs。

@Override注解标注一个子类重写了父类的某个方法,如果父类中没有这个方法,编译器会报错;

@Deprecated注解作用于方法、类、接口,表名此内容已经过去,是不是不推荐使用?但是标注过也是可以使用的;

@SupressWarnings注解用来抑制编译器的警告信息,例如使用集合时如果不指定泛型将有警告信息;

@SafeVarargs该注解是在JDK7出现的,表示“堆污染”警告;

      “堆污染”即是将一个不带泛型的变量赋值给一个带泛型的变量,将导致泛型变量污染,如果不加上面注解,编译器将给于提示,避免运行时异常。

我们通过一个简单的例子说一下怎么自定义注解,在自定义注解前需要了解一下元注解:给注解添加注解。

      我们来实现一个测试类的例子,在一个类里面指定哪些方法可以被测试,在JUNIT中 方法以test开头的才可以被测试它的这一机制也是通过注解来实现。

设计思路;

1.设计注解类

2.解析注解类的工具类

3.使用注解的类

TestAnnotation注解类

//ElementType、RetentionPolicy都是是枚举类,即如果某类的一个成员变量为几个固定值,可以使用枚举//注解保存到运行时,可以通过反射来读取注解@Retention(RetentionPolicy.RUNTIME)//只可以应用到方法上面。@Target(ElementType.METHOD)public @interface TestAnnotation {	String name() default "lilongsheng";	int age() default 25;}
      在上面程序中,注解的属性值是保存在了枚举类里面,这我们可以想到,自己定义注解时也把属性保存早枚举里面,如果这样设计可以让一个方法实现很多功能,例如增删改查只需要更具枚举值得类型来判断。
/**	 * @description process the annotation	 * @param clazz	 * @throws ClassNotFoundException	 * @throws InstantiationException	 * @throws IllegalAccessException	 */	public static void process(String clazz)		throws ClassNotFoundException, InstantiationException, IllegalAccessException	{		Object o = Class.forName(clazz).newInstance();		//遍历clazz对应类里面的所有方法		for(Method m: Class.forName(clazz).getMethods())		{			//如果该方法是否使用了@TestAnnotation修饰			if (m.isAnnotationPresent(TestAnnotation.class)) {				try {					//执行标有注解的方法					m.invoke(o);				} catch (Exception e) {					e.printStackTrace();					System.out.println("方法"+m+"运行失败"+e.getCause());				}			}		}	}
测试类

public class MyClass {		@TestAnnotation	public void method1()	{			System.out.println("测试方法1");	}		@TestAnnotation	public void method2()	{		System.out.println("测试方法2");	}		public void method3()	{		System.out.println("测试方法3");	}		public void method4()	{		System.out.println("测试方法4");	}}
执行结果:

      只有添加注释的方法被执行了,这就是自己定义注释来实现控制哪些方法可以被测试,哪些不被测试,注解有一个明显好处是解耦,注解赋予了程序特定功能,例如Hibernate中生成xml文件、事务控制等都是通过注解实现。

      但是Hibernate中xml文件生成注解不是利用反射生成,是利用APT工具类实现,需要将注解的RetentionPloliy设置为Source。

在我们熟悉的框架中spring、struts、Hibernate、springmvc、ejb等等中都引入了注解块,越来越多的框架都引入了注解,相比一大堆的配置文件而言的确简介了很多,spring中aop、ioc等机制值得我们去深入研究。

      这几天仔细看看JDK包里面的类,它里面很多东西值得我们认真学习,看的时候越看你就会觉的里面东西越多,上面用到了Method类、Class类,这两个类经常用到也很有用,class类中forName()、newInstance()两个方法是经常用的,Method类可以获得到一个类中的所有方法,这其中包括它从Object根类继承过来的方法,如getClass、hascode()等,通过看Object类发现getClass()方法用final修饰表名该方法不可以被子类重写,这个方法可以得到一个对象的数所类,然后得到类加载类、类路径都可以通过这种方式得到。

      每个类实例化之后会生成一个Class对象,getClass方法正是得到这个Class对象的方法,还有一个更简单的直接(对象.class)即可获取,但是如果我们只知道一个字符串呢,如“person”,这就需要使用forName()这个反射方法来获得了。

      拿到对象的Class对象后,就可以获取该类的所有信息,例如是否是接口、class、注解、方法等,以及得到所有字段、方法、注解等,也可以动态来执行方法。

      顺便也看了看JDK7中的泛型,在JDK7中泛型语法和JDK6以前的有一些区别,变的更为简洁了一些,例如在JDK6与JDK7对比

//JDK6.0	List
list=new ArrayList
(); //JDK7.0 List
list=new ArrayList<>();
  
    JDK7的语法变的简洁了,在构造器中不用指明类型也可以,还有很多泛型提高java性能的使用,同时也在看高效平台中的底层泛型、方法、接口封装。

转载于:https://www.cnblogs.com/lilongsheng1125/p/4978514.html

你可能感兴趣的文章
stegsolve---图片隐写查看器
查看>>
dubbo接口测试
查看>>
Maven生命周期详解(转)
查看>>
uoj#401. 【CTSC2018】青蕈领主(分治FFT)
查看>>
jvm -Xms -Xmx
查看>>
bash的pushd和popd
查看>>
2018 German Collegiate Programming Contest (GCPC 18)
查看>>
前端之jquery
查看>>
静态类和非静态类
查看>>
关于日志表的自动创建及分表储存
查看>>
topcoder srm 315 div1
查看>>
【super vlan的配置】
查看>>
洛谷P1443 马的遍历
查看>>
日期字符串格式化
查看>>
算法:合并两个排序的链表
查看>>
ps基本操作
查看>>
JS-OO-数据属性,访问器属性
查看>>
unity3d 各键值对应代码
查看>>
10年程序员的一些人生感悟
查看>>
《统一沟通-微软-实战》-6-部署-7-部署移动功能-1
查看>>