【动态页面】(三)之二:通过自定义注解读取Jar包的类名和属性名_html/css_WEB-ITnose
上篇博客介绍了通过反射读取Jar包的类名和属性名,但是问题是读不出类名和属性名的中文注释和属性类型。所以上篇博客埋下了一个伏笔,就是通过自定义注解的方式读取Jar包的类名、属性名、中文注释和属性类型。这篇博客我们就来好好讲讲是如何实现的。
首先先说一下,由于我们的Jar包没有放到项目下,所以就想着怎么能把Jar包添加进来,所以先做了一个类似于上传文件的功能,将Jar上传进来,然后再读取Jar包里面的类名、属性名等一系列属性,再添加到数据库中。总体的思路确定了,下面就开始实施。
首先是上传Jar包。这个我以前写过springMVC的文件上传的博客,具体可以参考我之前写的博客。
/** * Jar包上传 * @param request * @param response * @return * @throws IllegalStateException * @throws IOException */ @RequestMapping("/upload2") public String upload2(HttpServletRequest request,HttpServletResponse response) throws IllegalStateException, IOException{ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //判断request里面是否是Multipart类型的数据 if(multipartResolver.isMultipart(request)){ //把request强制转换成MultipartHttpServletRequest类型的 MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)request; //用迭代器去判断里面有多少文件,遍历文件的一个方法 Iterator<string> iter = multiRequest.getFileNames(); while (iter.hasNext()) { //迭代器的作用就是一个一个拿文件,把文件拿到 MultipartFile file = multiRequest.getFile((String)iter.next()); if(file != null){ //拿到文件之后输出文件 //首先定义文件名称 String fileName = file.getOriginalFilename(); //定义输出路径 String path = "G:/" + fileName; String fromFilePath = "G:\\" + fileName; //初始化文件 File localFile = new File(path); //用stringMVC给咱们提供的方法给它写到本地去 file.transferTo(localFile); try { getJarName(fromFilePath, request, response); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } return "/UploadJarBag"; </string>
下面就是为自定义注解做准备了,自定义一个注解解析器
package com.tgb.itoo.uisystem.entity;import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 定义一个注解解析器 * @author 高迎 * @date 2015年3月11日10:10:49 * */@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到 @Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})//定义注解的作用目标**作用范围字段、枚举的常量/方法 @Documented//说明该注解将被包含在javadoc中 public @interface FieldMeta { /** * 是否为序列号 * @return */ boolean id() default false; /** * 字段名称 * @return */ String name() default ""; /** * 字段长度,默认值为255 * @return */ int length() default 255; /** * 是否可编辑 * @return */ boolean editable() default true; /** * 是否在列表中显示 * @return */ boolean summary() default true; /** * 字段描述 * @return */ String description() default ""; }
package com.tgb.itoo.uisystem.controller;import java.lang.reflect.Field;import com.tgb.itoo.uisystem.entity.FieldMeta;/** * 获得到注解的帮助类 * @author 高迎 * @date 2015年3月11日10:12:15 * */public class SortableField { public SortableField(){} public SortableField(FieldMeta meta, Field field) { super(); this.meta = meta; this.field = field; this.name=field.getName(); this.type=field.getType(); } public SortableField(FieldMeta meta, Field field, int length) { super(); this.meta = meta; this.field = field; this.name=field.getName(); this.type=field.getType(); this.length=length; } public SortableField(FieldMeta meta, String name, int length, Class> type) { super(); this.meta = meta; this.name = name; this.length = length; this.type = type; } private FieldMeta meta; private Field field; private String name; private int length; public int getLength() { return length; } public void setLength(int length) { this.length = length; } private Class> type; public FieldMeta getMeta() { return meta; } public void setMeta(FieldMeta meta) { this.meta = meta; } public Field getField() { return field; } public void setField(Field field) { this.field = field; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Class> getType() { return type; } public void setType(Class> type) { this.type = type; } }
通过自定义注解读取Jar包的属性
/** * 读取jar包的类名和属性名 * @param jarFile * @throws Exception */ public void getJarName(String jarFile, HttpServletRequest request, HttpServletResponse response) throws Exception { //定义一个注解帮助类类型的list List<sortablefield> list = new ArrayList<sortablefield>(); try{ //通过将给定路径名字符串转换为抽象路径名来创建一个新File实例 File f = new File(jarFile); URL realURL = f.toURI().toURL(); URLClassLoader myClassLoader = new URLClassLoader(new URL[]{realURL},Thread.currentThread().getContextClassLoader()); //通过jarFile和JarEntry得到所有的类 JarFile jar = new JarFile(jarFile); //返回zip文件条目的枚举 Enumeration<jarentry> enumFiles = jar.entries(); JarEntry entry; //测试此枚举是否包含更多的元素 while(enumFiles.hasMoreElements()){ entry = (JarEntry)enumFiles.nextElement(); if(entry.getName().indexOf("META-INF") myclass = myClassLoader.loadClass(className); //根据class对象获得属性 Field[] fields = myclass.getDeclaredFields(); //这里面获得了四个字段 Entities entitiesList = new Entities(); //获得类上的注解 FieldMeta meta111 = myclass.getAnnotation(FieldMeta.class); System.out.println("类名的中文注释:" + meta111.name()); entitiesList.setEntityDesc(meta111.name()); //类名的中文描述(中文注释) for(Field f1 : fields){ //获取字段中包含fieldMeta的注解 FieldMeta meta = f1.getAnnotation(FieldMeta.class); System.out.println("打印长度:" + meta.length()); System.out.println("打印 类型:" + f1.getType().getName()); String getPropertyType = f1.getType().getName().toString(); String strPropertyType = getPropertyType.substring(getPropertyType.lastIndexOf(".")+1, getPropertyType.length()); System.out.println("最后截取的属性类型:" + strPropertyType); if(meta!=null){ SortableField sf = new SortableField(meta, f1); //System.out.println("字段名称:"+l.getName()+"\t字段类型:"+l.getType()+"\t注解名称:"+l.getMeta().name()+"\t注解描述:"+l.getMeta().description()); //System.out.println("字段名称:"+l.getName()); //将属性名和类名添加到实体中 entitiesList.setEntityName(strClassName); //类名 entitiesList.setDataType(strPropertyType); //属性类型 //entitiesList.setDataType(meta.getClass().getTypeName()); entitiesList.setDataLength(meta.length()); //长度 entitiesList.setPropertyName(f1.getName()); //属性名 entitiesList.setPropertyDesc(sf.getMeta().name()); //属性名的中文描述(中文注释) entitiesBean.addJarToTable(entitiesList); } } } } } } catch(IOException e){ e.printStackTrace(); } }</jarentry></sortablefield></sortablefield>
到这里,通过自定义注解的方式读取Jar包的类名、属性名包括中文注释和属性类型就都能实现了。我上传了一份Jar包:http://download.csdn.net/detail/huanjileaimeidan/8548345 这个是我上传上去可以进行测试的Jar包,有兴趣的可以下载下来试一试,有什么问题请在下方留言,欢迎和我沟通。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公众号网页更新缓存,这玩意儿,说简单也简单,说复杂也够你喝一壶的。你辛辛苦苦更新了公众号文章,结果用户打开还是老版本,这滋味,谁受得了?这篇文章,咱就来扒一扒这背后的弯弯绕绕,以及如何优雅地解决这个问题。读完之后,你就能轻松应对各种缓存难题,让你的用户始终体验到最新鲜的内容。先说点基础的。网页缓存,说白了就是浏览器或者服务器为了提高访问速度,把一些静态资源(比如图片、CSS、JS)或者页面内容存储起来。下次访问时,直接从缓存里取,不用再重新下载,速度自然快。但这玩意儿,也是个双刃剑。新版本上线,

本文讨论了使用HTML5表单验证属性,例如必需的,图案,最小,最大和长度限制,以直接在浏览器中验证用户输入。

本文展示了使用CSS为网页中添加有效的PNG边框。 它认为,与JavaScript或库相比,CSS提供了出色的性能,详细介绍了如何调整边界宽度,样式和颜色以获得微妙或突出的效果

本文讨论了html&lt; datalist&gt;元素,通过提供自动完整建议,改善用户体验并减少错误来增强表格。Character计数:159

本文讨论了HTML&lt; Progress&gt;元素,其目的,样式和与&lt; meter&gt;元素。主要重点是使用&lt; progress&gt;为了完成任务和LT;仪表&gt;对于stati

本文解释了HTML5&lt; time&gt;语义日期/时间表示的元素。 它强调了DateTime属性对机器可读性(ISO 8601格式)的重要性,并在人类可读文本旁边,增强Accessibilit

本文讨论了HTML&lt; meter&gt;元素,用于在一个范围内显示标量或分数值及其在Web开发中的常见应用。它区分了&lt; meter&gt;从&lt; progress&gt;和前
