java 获取包名类名_获取指定包名下的所有类的类名(全名)
参考来源:
以下代码一键运行:
package test;
import java.io.File;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class ClassUtils {
public static void main(String[] args) throws Exception {
String packageName = "org.objectweb.asm";
Set classNames = getClassName(packageName, false);
if (classNames != null) {
for (String className : classNames) {
System.out.println(className);
}
}
}
/**
* 获取某包下所有类
* @param packageName 包名
* @param isRecursion 是否遍历子包
* @return 类的完整名称
*/
public static Set getClassName(String packageName, boolean isRecursion) {
Set classNames = null;
ClassLoader loader = Thread.currentThread().getContextClassLoader();
String packagePath = packageName.replace(".", "/");
URL url = loader.getResource(packagePath);
if (url != null) {
String protocol = url.getProtocol();
if (protocol.equals("file")) {
classNames = getClassNameFromDir(url.getPath(), packageName, isRecursion);
} else if (protocol.equals("jar")) {
JarFile jarFile = null;
try{
jarFile = ((JarURLConnection) url.openConnection()).getJarFile();
} catch(Exception e){
e.printStackTrace();
}
if(jarFile != null){
getClassNameFromJar(jarFile.entries(), packageName, isRecursion);
}
}
} else {
/*从所有的jar包中查找包名*/
classNames = getClassNameFromJars(((URLClassLoader)loader).getURLs(), packageName, isRecursion);
}
return classNames;
}
/**
* 从项目文件获取某包下所有类
* @param filePath 文件路径
* @param className 类名集合
* @param isRecursion 是否遍历子包
* @return 类的完整名称
*/
private static Set getClassNameFromDir(String filePath, String packageName, boolean isRecursion) {
Set className = new HashSet();
File file = new File(filePath);
File[] files = file.listFiles();
for (File childFile : files) {
if (childFile.isDirectory()) {
if (isRecursion) {
className.addAll(getClassNameFromDir(childFile.getPath(), packageName+"."+childFile.getName(), isRecursion));
}
} else {
String fileName = childFile.getName();
if (fileName.endsWith(".class") && !fileName.contains("$")) {
className.add(packageName+ "." + fileName.replace(".class", ""));
}
}
}
return className;
}
/**
* @param jarEntries
* @param packageName
* @param isRecursion
* @return
*/
private static Set getClassNameFromJar(Enumeration jarEntries, String packageName, boolean isRecursion){
Set classNames = new HashSet();
while (jarEntries.hasMoreElements()) {
JarEntry jarEntry = jarEntries.nextElement();
if(!jarEntry.isDirectory()){
/*
* 这里是为了方便,先把"/" 转成 "." 再判断 ".class" 的做法可能会有bug
* (FIXME: 先把"/" 转成 "." 再判断 ".class" 的做法可能会有bug)
*/
String entryName = jarEntry.getName().replace("/", ".");
if (entryName.endsWith(".class") && !entryName.contains("$") && entryName.startsWith(packageName)) {
entryName = entryName.replace(".class", "");
if(isRecursion){
classNames.add(entryName);
} else if(!entryName.replace(packageName+".", "").contains(".")){
classNames.add(entryName);
}
}
}
}
return classNames;
}
/**
* 从所有jar中搜索该包,并获取该包下所有类
* @param urls URL集合
* @param packageName 包路径
* @param isRecursion 是否遍历子包
* @return 类的完整名称
*/
private static Set getClassNameFromJars(URL[] urls, String packageName, boolean isRecursion) {
Set classNames = new HashSet();
for (int i = 0; i < urls.length; i++) {
String classPath = urls[i].getPath();
//不必搜索classes文件夹
if (classPath.endsWith("classes/")) {continue;}
JarFile jarFile = null;
try {
jarFile = new JarFile(classPath.substring(classPath.indexOf("/")));
} catch (IOException e) {
e.printStackTrace();
}
if (jarFile != null) {
classNames.addAll(getClassNameFromJar(jarFile.entries(), packageName, isRecursion));
}
}
return classNames;
}
}
java 获取包名类名_获取指定包名下的所有类的类名(全名)相关推荐
- APP的包名和签名获取工具
APP的包名和签名获取工具 下载地址: http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/doc/AppManage.apk 获取签名工具 https: ...
- iOS 怎样获取wifi名(无法获取wifi名)(亲测有效)
文章目录 1.代码实现 2.iOS12后要求在开发者网站的App ID Configuration和Xcode中打开wifi开关 3.ios13后要求用户授权开启定位权限,才能获取wifi名 1.代码 ...
- 微信分享相关:报错“微信:包名不对,请检查包名是否与开放平台填写一致”
背景:应用或多或少会接入微信分享的功能.但是由于某些原因,自己配置的应用信息与开放平台的信息一致,但还是会报错:"包名不对,请检查包名是否与开放平台填写一致",接下来就用两个实验来 ...
- 取 java 程序运行的路径_获取Java程序运行的路径 | 获取当前jar包的路径
经过试验,不管是否是Jar包,不管是否是Tomcat部署,以下三个方法均可实现. package test; public class MyPath { public static String ge ...
- Android获取本机浏览器包名,并调用指定浏览器打开网页
昨天还在嘀咕着项目快做完了,接下来公司会安排什么事,结果今天就给了我一个新任务,其中要做的一个功能就是指定调用谷歌浏览器打开网页,如果没有该浏览器就提示客户进行下载,查找一番资料后,觉得这种东西还是要 ...
- java jsp取静态常量_获取java静态
Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...
- java定义包的关键字_如何定义包,关键字是什么?
展开全部 Java关键字及其作用 一. 关键字总览: 访问控制 private protected public 类62616964757a686964616fe59b9ee7ad9431333363 ...
- py获取前端的参数_获取百度指数
百度指数简介 百度指数有一个详细的帮助文档,下面列出来的几个点是我的个人总结: 百度指数是度量网民搜索量多寡的指数,可以用来描述社会对某某某的关注度. 百度指数大众版不要钱,百度指数专业版要钱,但不对 ...
- java包限制使用时间_给jar包加壳限制使用时间
展开全部 很多程序员在使用eclipse开发应用程序,必然会用到jar包,由于不清楚jar包的位置,又每次都32313133353236313431303231363533e58685e5aeb931 ...
最新文章
- iphone用计算机显示器,苹果显示器接普通电脑怎么操作【详细介绍】
- 2010年7月微软最有价值专家(MVP)当选名单
- 基于 Zookeeper 的分布式锁实现
- (二)boost库之字符串格式化
- Beaglebone Back学习三(开发环境搭建)
- 阿里巴巴基于Java容器的多应用部署技术实践
- Flutter实战之Image和FadeInImage
- 精心整理|Python爱好者社区历史文章合集(作者篇)--20190925从豆瓣获取
- 软件测试工作的不足与改善,软件测试工作中对问题的发现和改进
- gcc:扩展功能:除标准里定义的C特性之外的功能;-pedantic
- 使用OpenCV实现运动背景的重建
- 声网连麦+直播+视频+游戏“史上最强”社交直播方案 打造陌陌全新8.0改版
- BZOJ4487 [JSO12015] 染色问题 容斥原理
- 拼多多校招----大整数相乘(python)
- Clion安装及相关环境(MinGW和OpenOCD)的配置及利用Clion点亮led灯
- 材料研究生转行做什么?
- 《 FreeSWITCH权威指南》——1.2 电话实现技术
- (gMLP)Pay Attention to MLPs
- 古诺双寡头模型MATLAB求解(博弈论)
- 使用Harr特征的级联分类器实现目标检测
热门文章
- LDAP 配置 ldap_bind: Invalid credentials (49)
- 关于数据库内“表”的几点
- Hive 正则匹配函数 regexp_extract
- 手机端 超链接 识别电话号码
- 如何在word里面插入目录
- oracle中的NVL,NVL2,NULLIF,COALESCE函数使用
- Directx11教程(19) 画一个简单的地形
- Windows2008 组策略应用
- BZOJ3262/Luogu3810 陌上花开 (三维偏序,CDQ)
- CentOS tcpdump的使用实例