JAVA注解引发的思考
自从JDK5開始Java開始添加了对元数据(MetaData)的支持,也就是注解(Annotation),到JDK7时已经有四种基本注解,新添加了一种@SafeVarargs。
@Override注解标注一个子类重写了父类的某个方法,假设父类中没有这种方法,编译器会报错;
@Deprecated注解作用于方法、类、接口,表名此内容已经过去,是不是不推荐使用?可是标注过也是能够使用的;
@SupressWarnings注解用来抑制编译器的警告信息。比如使用集合时假设不指定泛型将有警告信息;
@SafeVarargs该注解是在JDK7出现的,表示“堆污染”警告;
“堆污染”即是将一个不带泛型的变量赋值给一个带泛型的变量,将导致泛型变量污染。假设不加上面注解。编译器将给于提示,避免执行时异常。
我们通过一个简单的样例说一下怎么自己定义注解,在自己定义注解前须要了解一下元注解:给注解加入注解。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlsb25nc2hlbmcxMTI1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
我们来实现一个測试类的样例,在一个类里面指定哪些方法能够被測试,在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性能的使用,同一时候也在看高效平台中的底层泛型、方法、接口封装。
JAVA注解引发的思考的更多相关文章
- 一个JAVA题引发的思考
转载自:http://www.cnblogs.com/heshan664754022/archive/2013/03/24/2979495.html 十年半山 今天在论坛闲逛的时候发现了一个很有趣的题 ...
- 一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考
2018年12月12日18:44:53 一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考 案件现场 不久前,在开发改造公司一个端到端监控日志系统的时候,出现了一 ...
- Spring之LoadTimeWeaver——一个需求引发的思考---转
原文地址:http://www.myexception.cn/software-architecture-design/602651.html Spring之LoadTimeWeaver——一个需求引 ...
- Java注解实践
Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ...
- 黑马程序员:Java基础总结----java注解
黑马程序员:Java基础总结 java注解 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...
- 秒懂,Java 注解 (Annotation)你可以这样学 - CSDN博客
https://blog.csdn.net/briblue/article/details/73824058 文章开头先引入一处图片. 这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我个人比较 ...
- 秒懂,Java 注解 (Annotation)你可以这样学
转自: https://blog.csdn.net/briblue/article/details/73824058 文章开头先引入一处图片. 这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我 ...
- Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...
- SQLAlchemy并发写入引发的思考
背景 近期公司项目中加了一个积分机制,用户登录签到会获取登录积分,但会出现一种现象就是用户登录时会增加双倍积分,然后生成两个积分记录.此为问题 问题分析 项目采用微服务架构,下图为积分机制流程 ...
随机推荐
- python 05 关于对python中引用的理解
数据的在内存中的地址就是数据的引用. 如果两个变量为同一个引用,那么这两个变量对应的数据一定相同: 如果两个变量对应的数据相同,引用不一定相同. 通过id(数据)可以查看数据对应的地址,修改变量的值, ...
- HTML5结构
1.显示编排内容区域块(明确使用section等元素创建文档结构,在每个区域块中使用标题元素) 2.隐示编排内容区域块(不明确使用section等元素,而是根据网页需求来将各级的元素创建出来) 3.标 ...
- timeslot概念(还是不太懂呀!!)
rules: 1. event.triggered只会保持一个time_slot,在下一个time_slot将会丢失这个标记,如果不能保证在每一个time_slot都会检测到这个标志,那么将会丢失这个 ...
- htmlpurifier的使用
什么是htmlpurifier?? HTML Purifier是一个可以用来移除所有恶意代码(XSS),而且还能确保你的页面遵循W3C的标准规范的PHP类库. 在php里解决XSS最简单的方法是使用h ...
- Django框架基础知识05-自定义模板标签与过滤器
根据一定规则,自己定义出符合需求功能的.用在任何你有需求的地方,因为内置的满足不了我们的需求,不同的东西有不同的定义规则 目前最最重要的就是HOW 一 文件路径配置: templates 存放自定义 ...
- os操作文件
os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依 ...
- 【实验吧】转瞬即逝write up
---恢复内容开始--- 虽然这是很简单的一道题,但这是我第一次拿着题有很清晰的思路,并且脚本也有思路写,拿到文件用ida打开,分析main函数: int __cdecl main(int argc, ...
- 《算法导论》 — Chapter 7 快速排序
序 快速排序(QuickSort)也是一种排序算法,对包含n个数组的输入数组,最坏情况运行时间为O(n^2).虽然这个最坏情况运行时间比较差,但是快速排序通常是用于排序的最佳实用选择,这是因为其平均性 ...
- 关于Hibernate中No row with the given identifier exists问题的原因及解决
今天遇到一个bug,截图如下 有两张表,table1和table2.产生此问题的原因就是table1里做了关联<one-to-one>或者<many-to-one unique=&q ...
- hdu4714树形DP+贪心(乱搞)
Tree2cycle A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...