Java注解探究,自定义注解封装简易网络请求框架
来源:互联网 发布:传淘宝需要注意什么 编辑:程序博客网 时间:2024/06/06 16:38
注解的定义:提供一种为程序设置元数据的方法。
基本原则:注解不能干扰程序代码的运行,无论增加或删除注解,代码都能够正常运行。
按照使用分类,可以分为系统注解和自定义注解。
A:系统注解分为标准注解和元注解
1.标准注解 我们都见过好多,比如下面的:
@Override 复写父类方法或者实现接口方法的提示*
@Deprecated 方法过时的提示
@SuppressWarnings 解除编译器的警告,它参数如下:
deprecation 使用了过时的方法或者类是的警告 unchecked 执行了未检查的转换时的警告 failthrouth 当switch语句直接通往下一种情况,而没有break时的警告 path 在类路径,源文件路径等中有不存在的路径时的警告 serial 当在可序列化的类上缺少id finally 任何finally子句不能正常完成的警告 all 关于以上所有警告的情况
2.元注解 负责注解其他注解的注解,常见如下:
@Retention 注释的生命周期,其参数RetentPoicy 分类如下:
Source 注解只在源码中存在 Class 注解在源码和字节码中存在 Runtime 注解在源码,字节码和运行时都存在
示例代码:
@Retention(RetentionPolicy.RUNTIME)//元注解,标记注解生命周期
@Target 注解可以作用在什么地方,其参数如下:
ElementType.Constructor 构造方法中 ElementType.Field 成员变量和枚举常量 ElementType.Local_Variable 局部变量 ElementType.Method 方法 ElementType.package 包 ElementType.parameter 方法参数 ElementType.type 接口,类,枚举,注解
实例代码:
@Target(ElementType.METHOD)//元注解,标记作用范围在方法中
@Documented将注释体现在doc文档中
示例代码:
@Documented //元注解,标记生产文档时不清除
@Inhertied 允许子类继承父类的注解
B 注解注解元素数据类型
所有基本数据类型 String void Class 枚举 Annotation
C 类中注解提取方法
getAnnotation 返回该类上指定类型的注解
//前面说注解可以target在哪个位置,就用哪个目标字段去获取//比如前面@Target(ElementType.METHOD),getAnnotation就用Method去获取,Method.getAnnotation(),下面是都以此类推
getAnnotations 返回该类上的所有注解 IsAnnotationPresent 判断该类上是否包含指定类型的注解 getDeclaredAnnotations 忽略继承的注解,获取所有注解
概念性的东西扯得太多了,话不多说,代码撸起来,自定义注解,
首先查看java 测试类的代码:
public class TestAnotation { //创建线程池来执行任务 static ThreadPoolExecutor executor=new ThreadPoolExecutor(4, //核心线程数 12, //最大线程数 60, //线程空闲周期 TimeUnit.SECONDS, //周期单位s new SynchronousQueue<>()//创建一个任务队列 ); public static void main(String[] args) { // TODO Auto-generated method stub requestFromNet(); } @RequestUrl(Constant.NETURL) @RequstType(Type.GET) public static void requestFromNet(){ executor.execute(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub String result=RequestNet.parseRequest(new TestAnotation()); System.out.println("网络请求成功!!!结果:=="+result); } }); }}
注意:上面用到了两个自定义注解(网络请求地址和请求类型),下面是注解的内容
自定义网址注解:
@Target(ElementType.METHOD)//元注解,标记该注解作用范围@Retention(RetentionPolicy.RUNTIME)////元注解,标记该注解生命周期@Documented //元注解,标记生成javadoc时解释说明该注解public @interface RequestUrl { //定义网络URL类型为String String value () default "";//默认请求网址为空}
自定义网络请求类型注解:
/** * 自定义注解 * 注解类型支持所有的基本数据类型,包括枚举 * @author Administrator * */@Target(ElementType.METHOD)//元注解,标记作用范围在方法中@Documented //元注解,标记生产文档时不清除@Retention(RetentionPolicy.RUNTIME)//元注解,标记注解生命周期,有运行时,classpublic @interface RequstType { //用枚举指定请求类型 enum Type{GET,POST}; //返回类型是Type中的一个,默认是GET Type value() default Type.POST;}
注解的本质是接口,它的实现是用java反射来实现的,先面试看注解使用代码
public class RequestNet { public static String doGetRequest(String url){ String result=""; if(null==url){ try { throw new Throwable( "empty netUrl!!!"); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } } HttpURLConnection conneciton = null; try { URL mURL = new URL(url); conneciton=(HttpURLConnection) mURL.openConnection(); InputStream inputs= conneciton.getInputStream(); String line=""; BufferedReader reader = new BufferedReader(new InputStreamReader(inputs)); StringBuilder stringBuilder = new StringBuilder(); while((line=reader.readLine())!=null){ stringBuilder.append(line+"\r\n"); } result=stringBuilder.toString(); System.out.println("test 网络请求结果:"+result); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("test 网络异常原因:"+e.toString()); }finally{ //下面是谷歌官方推荐的,详见谷歌官方文档 if(conneciton!=null){ conneciton.disconnect(); } } return result; } public static String doPostRequest(String url){ return null; } //解析传入的对象中含有的注解 //注解底层就是反射 public static String parseRequest(Object obj){ String url=""; String result=""; //第一步。获取class文件 Class clazz= obj.getClass(); System.out.println("test class 名字:"+clazz.getSimpleName()); //第二部,注解都是在方法上的,获取所有的方法 Method[] methods=clazz.getMethods(); //第三步:遍历方法 for (Method method : methods) { System.out.println("test 方法名字:"+method.getName()); //判断每个方法上的注解是否含有 if(method.isAnnotationPresent(RequestUrl.class)){ //拿出方法上的这个注解 RequestUrl urlAnotation=method.getAnnotation(RequestUrl.class); //拿出注解传入的值 url=urlAnotation.value(); System.out.println("test 网址的值11:"+url); } if(method.isAnnotationPresent(RequstType.class)){ RequstType requestType=method.getAnnotation(RequstType.class); if(requestType.value().equals(Type.GET)){ //执行GET网络请求 result=doGetRequest(url); } if(requestType.value().equals(Type.POST)){ //执行POST网络请求 result=doPostRequest(url); } } } return result; }}
辅助类Constant中存储着网络请求网址
/** * 网络参数标记 * @author Administrator */public class Constant { public static final String NETURL="http://118.26.64.162:9832/app/" + "rest/app/articleCategory/list/news";}
最后查看运行情况如下图:
2 0
- Java注解探究,自定义注解封装简易网络请求框架
- Java注解-自定义注解
- Java注解----自定义注解
- Java注解自定义注解
- 【Java】【注解】自定义注解
- 自定义一个Java运行时注解框架
- Java 自定义注解实现网络访问重试
- Java注解(2)-自定义注解、注解处理器
- Android 自定义注解框架
- 自定义注解框架实现
- java之注解 自定义注解
- Java注解-自定义注解实例
- Java注解二 自定义注解
- Java注解及自定义注解
- java 注解详解,自定义注解
- Java自定义注解——简易实现spring @Autowired
- Java自定义注解——简易实现spring @Autowired
- 轻量级简易 Java http 网络请求的封装: SimpleHttpUtils
- shell脚本和vim模式初步学习
- js学习-数组(1)
- LruCache源码解析
- 常见的typedef用法总结
- Postgresql快速插入测试数据
- Java注解探究,自定义注解封装简易网络请求框架
- 1019. General Palindromic Number (20)
- 一个非常好的JQuery中文文档网站
- 【LeetCode】Minimum Absolute Difference in BST 解题报告
- Python3.5 安装scipy
- android移动开发程序猿的成长之路
- 二叉树的层次遍历
- [quant-ai 001] ubunut+git 源码服务器
- RMI网络编程开发之二 如何搭建基于JDK1.5的分布式JAVA RMI 程序