2 u012733415 u012733415 于 2017.04.21 00:56 提问

根据绝对路径得到Class对象 5C

假如我有一个类,绝对路径是D:\com\csdn\Test.class。

我怎样才能获取到这个类的全称,也就是com.csdn.Test。

我最终想要的是Test.class 的Class对象。

5个回答

engchina
engchina   Rxr 2017.04.21 09:21

使用java的reflection,如果已经知道要使用类的路径,就知道该类所属包。
直接Classloader的loadClass方法,参数为(该类的包.类)



        try {
            ClassLoader loader = ClassLoader.getSystemClassLoader();
            Class clazz = loader.loadClass("com.csdn.Test");
            System.out.println(clazz.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

输出

engchina
engchina 回复怖呆: 你的类的绝对路径是怎么得到的?
2 个月之前 回复
u012733415
u012733415 你搞错了,只有类的绝对路径。
2 个月之前 回复
wushucheng18
wushucheng18   2017.04.21 10:43

根据绝对路径,用正则表达式得到全称,再用反射得到对象。

u012733415
u012733415 你这样不行的,你不知道那个文件夹是对顶层的包名。这个方案肯定不行
2 个月之前 回复
qq_35451685
qq_35451685   2017.04.21 16:18
u012733415
u012733415 你这个应该可以,但是比较繁琐,我用了asm 很方便的。
2 个月之前 回复
yizishou
yizishou   2017.04.21 17:15

一个类的所有信息全都保存在class文件内,从class文件中解析类名是肯定可行的。

有一个办法就是从文件头开始解析,魔数、版本号、常量池计数器、第一个常量、第二个常量,……
有时候第二个常量就是你想要的类的全限定名了,但是无法保证,因为谁知道常量是不是这么排序的呢。
稳妥的办法,就是跳过常量池,接下来就能确切地知道本类的类名存储在第几个常量里了,但问题是正确地读取常量池是个挺复杂的问题啊。

推荐个我很喜欢的博客,想深入了解class文件的话可以好好读读:class文件基本组织结构

所以不推荐这个方法。

推荐拿别人写好的代码来做这个事情,刚刚去GitHub上找了一下,有个叫做ClassAnalyzer的项目,可以满足你的需求:
https://github.com/tinylcy/ClassAnalyzer

u012733415
u012733415 你这个我也想过,自己来解析。不过我现在用asm ,很方便的
2 个月之前 回复
yizishou
yizishou 看下这个文件 https://github.com/tinylcy/ClassAnalyzer/blob/master/src/main/java/org/tinylcy/ClassReader.java,有个方法 public static ClassFile read(InputStream inputStream)
2 个月之前 回复
qq_33443101
qq_33443101   2017.04.21 18:44
Csdn user default icon
上传中...
上传图片
插入图片