您的位置:首页 > 编程语言 > Java开发

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

2015-03-16 11:50 375 查看
    今天这篇博客将会重点介绍利用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{
//去掉后缀.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里面的类名属性以及注释的,下篇博客见!

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: