【动态页面】(三)之一:利用Java反射机制读取Jar包的类名和属性名
2015-03-16 11:50
375 查看
今天这篇博客将会重点介绍利用Java反射机制读取Jar包的类名和属性名.具体的业务是这样的: 我需要将别的系统的实体Jar扔到我这里,然后读出其类名、类名描述(中文注释)和属性名、属性名描述(中文注释)以及属性长度等,然后添加到数据库中。
最开始是没有思路的,后来大牛给出的意见是利用Java反射来实现,后来就着手开始查这方面的资料。最开始是只能读出类名和属性名称、类型。
![](https://img-blog.csdn.net/20150316095939841?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FveWluZ19ibG9ncw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
读出的方法名:
![](https://img-blog.csdn.net/20150316114731288?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ2FveWluZ19ibG9ncw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
但是,你仔细看我们上面的代码,它是要指定Jar包的路径的,要么在服务器的某个位置上,要么在我们项目的jar包目录下。但是问题是我们的项目是用Maven管理的,这样的话我们的Jar包往哪儿拷贝呢?而且,上面的这种方式读不出注释(注意:是注释,不是注解,我们是想把类名以及这个字段上的中文注释添加进数据库,用于对表单编辑时使用,但是大家知道注释是不走代码的,只是起到标示的作用),后来我们想到了一个办法就是读注解,利用自定义注解的方式去获取注解里面的中文中文注释。限于篇幅的原因,我们下篇文章接着讲是如何自定义注解来实现读取Jar里面的类名属性以及注释的,下篇博客见!
最开始是没有思路的,后来大牛给出的意见是利用Java反射来实现,后来就着手开始查这方面的资料。最开始是只能读出类名和属性名称、类型。
package cn.itcast.oa.view.action; import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; import java.util.jar.JarEntry; import java.util.jar.JarFile; public class getJarClassnameAndAttribute { public static void getJarName(String jarFile) throws Exception { try{ //通过将给定路径名字符串转换为抽象路径名来创建一个新File实例 File f = new File(jarFile); URL url1 = f.toURI().toURL(); URLClassLoader myClassLoader = new URLClassLoader(new URL[]{url1},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")<0){ String classFullName = entry.getName(); if(classFullName.indexOf(".class")<0){ classFullName = classFullName.substring(0,classFullName.length()-1); } else{ //去掉后缀.class String className = classFullName.substring(0,classFullName.length()-6).replace("/", "."); Class<?> myclass = myClassLoader.loadClass(className); //打印类名 System.out.println("~~~~~~~~~~~~~~~~~~~~~~~打印类名:~~~~~~~~~~~~~~~~~~~~~~~~~" + className); //得到类中包含的属性 //Field[] fields=oFandM.getClassDeclaredFields(className); Class clazz = Class.forName(className); //根据class对象获得属性 Field[] fields = clazz.getDeclaredFields(); for(Field f1 : fields){ //打印每个属性的类型 System.out.println("~~~~~~~~~~~~~~~属性类型:" + f1.getType()); //打印每个属性的名字 System.out.println("~~~~~~~~~~~~~~~属性名称:" + f1.getName()); } //通过getMethod得到类中包含的方法 Method m[] = myclass.getMethods(); for(int i=0; i<m.length; i++){ String sm = m[i].getName(); //打印除默认方法外的方法 if(DEFAULT_METHOD.indexOf(sm)<0){ System.out.println("~~~~打印方法名:~~~~~" + m[i].toString().substring((m[i].toString().indexOf(className)))); } } } } } } catch(IOException e){ e.printStackTrace(); } } /** * 这些默认方法不打印 */ private static String DEFAULT_METHOD = "waitequalsnotifynotifyAlltoStringhashCodegetClass"; public static void main(String[] args) throws Exception { //jar包所在路径 /*getJarName("F:\\user.jar"); getJarName("F:\\role1.jar"); getJarName("F:\\role2.jar"); getJarName("F:\\roleTest3.jar");*/ getJarName("\\user.jar"); } }这样读出的效果是:
读出的方法名:
但是,你仔细看我们上面的代码,它是要指定Jar包的路径的,要么在服务器的某个位置上,要么在我们项目的jar包目录下。但是问题是我们的项目是用Maven管理的,这样的话我们的Jar包往哪儿拷贝呢?而且,上面的这种方式读不出注释(注意:是注释,不是注解,我们是想把类名以及这个字段上的中文注释添加进数据库,用于对表单编辑时使用,但是大家知道注释是不走代码的,只是起到标示的作用),后来我们想到了一个办法就是读注解,利用自定义注解的方式去获取注解里面的中文中文注释。限于篇幅的原因,我们下篇文章接着讲是如何自定义注解来实现读取Jar里面的类名属性以及注释的,下篇博客见!
相关文章推荐
- 【动态页面】(三)之二:通过自定义注解读取Jar包的类名和属性名
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- 利用java反射机制 读取配置文件 实现动态类载入以及动态类型转换
- 如何在SpringMVC框架中利用Java反射机制和Javassist实现Java对象、属性、注解的动态创建生成
- 利用java反射机制 读取配置文件 实现动态类加载以及动态类型转换
- 使用DOM动态改变页面外观----读取和设定元素属性
- 利用UrlRewrite,asp.net动态生成htm页面(补充说明)
- 利用servlet动态生成wap页面
- 利用ASP.NET技术动态生成HTML页面
- 利用Ajax无全页面提交实现动态画图
- 利用Ajax无全页面提交实现动态画图
- 利用UrlRewrite,asp.net动态生成htm页面(补充说明2)
- java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取
- 利用XML动态生成ASPX页面
- 利用ASP.NET技术动态生成HTML页面
- 利用ASP.NET技术动态生成HTML页面
- java web 利用 commons-fileupload-1.2 实现文件上传 解决 中文乱码& 非文件属性的读取
- 利用ASP.NET技术动态生成HTML页面