【动态页面】(三)之一:利用Java反射机制读取Jar包的类名和属

今天这篇博客将会重点介绍利用Java反射机制读取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{//去掉后缀.classString 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里面的类名属性以及注释的,下篇博客见!

期待遇上一位撑着油纸伞,结着忧愁丁香一样的姑娘;或者在春暖花开时,

【动态页面】(三)之一:利用Java反射机制读取Jar包的类名和属

相关文章:

你感兴趣的文章:

标签云: