zoukankan      html  css  js  c++  java
  • JAVA注解引发的思考

          自从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<String> list=new ArrayList<String>();
    	//JDK7.0
    	List<String> list=new ArrayList<>();
          JDK7的语法变的简洁了。在构造器中不用指明类型也能够,还有非常多泛型提高java性能的使用,同一时候也在看高效平台中的底层泛型、方法、接口封装。



  • 相关阅读:
    团队项目-选题报告
    第一次结对编程作业
    第一次个人编程作业
    软工作业1
    总结
    2013-2014 ACM ICPC Central European Regional Contest (CERC 13) K-Digraphs
    2018CCPC吉林赛区 F
    计蒜客-A1594 封印之门
    HDU-1599 find the mincost route
    POJ-2240 Arbitrage
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6825832.html
Copyright © 2011-2022 走看看