`

如何取得某个包下面的所有的Class对象

    博客分类:
  • java
阅读更多
查看了javadoc,google了,没有找到好的答案,有个例子指出了一种方法,给一个入口Class,搜索这个Class所继承,引用的Class,以及这些继承引用的Class所继承引用的Class,如此递归下去,得到一个Class的List。但这种方法不能达到我的目的,我所能知道的只有package name,没有任何相关的class,如何才能或的这个package下的Class对象的list呢?
分享到:
评论
10 楼 frogfool 2007-03-20  
让我联想到
javax.naming.Context.URL_PKG_PREFIXES

不知道是怎么找到javax.naming.Context.URL_PKG_PREFIXES
是如何找到其下的context factories?!
9 楼 kenny319 2007-03-20  
在您确切知道CLASS文件的路径的前提下是可以实现的,否则,字节码文件甚至可以通过网络下载,所以无法实现。
8 楼 祁兴明 2007-03-20  
rtm :你的这个解决办法是不错哦 可不可以把里面的代码分割为一个个的方法呢 请您试一试 OK!
7 楼 rtm 2007-03-20  
String classpath = "bean,spring";
String[] classpaths = StringUtils.split(classpath, ",");
		List xmllist = new java.util.ArrayList();
		for (int j = 0; j < classpaths.length; j++) {
			Enumeration pathEnumeration = SpringHelper.class.getClassLoader()
					.getResources(classpaths[j]);
			if (pathEnumeration == null) {
				throw new RuntimeException("路径[" + classpaths[j] + "]不存在");
			}
			while (pathEnumeration.hasMoreElements()) {
				URL url = (URL) pathEnumeration.nextElement();
				String path = url.getPath();
				String protocol = url.getProtocol();
				if ("file".equals(protocol)) {
					File file = new File(url.getPath());
					if (file.isDirectory()) {
						File[] files = file.listFiles();
						if (files != null) {
							for (int i = 0; i < files.length; i++) {
								File xmlFile = files[i];
								if (xmlFile.getName().endsWith(".xml")) {
									if (!xmllist.contains(classpaths[j] + "/"
											+ xmlFile.getName())) {
										xmllist.add(classpaths[j] + "/"
												+ xmlFile.getName());
									}
								}
							}
						}
					} else {
						if (file.getName().endsWith(".xml")) {
							if (!xmllist.contains(classpaths[j] + "/"
									+ file.getName())) {
								xmllist.add(classpaths[j] + "/"
										+ file.getName());
							}
						}
					}
				}
				if ("jar".equals(protocol)) {
					URL jarUrl = new URL(path);
					path = jarUrl.getPath();
					if (path.endsWith("!/" + classpaths[j])) {
						/**
						 * jar包中
						 */
						path = path.substring(0, path.lastIndexOf("!/"
								+ classpaths[j]));
						JarFile jarFile = new JarFile(new File(path));
						Enumeration enumeration = jarFile.entries();
						while (enumeration.hasMoreElements()) {
							JarEntry jarEntry = (JarEntry) enumeration
									.nextElement();
							if (jarEntry.getName().startsWith(
									classpaths[j] + "/")
									&& jarEntry.getName().endsWith(".xml")) {
								String xmlfileName = jarEntry.getName()
										.substring(
												jarEntry.getName().lastIndexOf(
														"/") + 1,
												jarEntry.getName().length());
								if (!xmllist.contains(classpaths[j] + "/"
										+ xmlfileName)) {
									xmllist.add(classpaths[j] + "/"
											+ xmlfileName);
								}
							}
						}
					}
				}
			}
			if (xmllist.size() == 0) {
				throw new RuntimeException("路径[" + classpaths[j]
						+ "]下没有spring配置文件");
			}
		}

		String[] xmlFileNames = new String[xmllist.size()];
		for (int i = 0; i < xmlFileNames.length; i++) {
			xmlFileNames[i] = (String) xmllist.get(i);
			System.out.println(xmlFileNames[i]);
		}
		ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
				xmlFileNames);
		factory = (BeanFactory) appContext;
6 楼 Godlikeme 2007-03-18  
classloader有一个搜索class的方式,不知道可不可以用于package的搜索,哪位熟悉的给点拨下,
另,楼上的楼上,有FileUtils, ClassUtils可以让代码更整洁些。
5 楼 yiding_he 2007-03-18  
搜索 classpath,然后读取所有的 class 文件。仅供参考。
4 楼 tiyi 2007-03-18  
public static List<String> getClasses(String packageName, Class clazz) {
		List<String> res = new ArrayList<String>();
		String pckgname = "test.package.test";
		pckgname = packageName;
		String name = new String(pckgname);
		if (!name.startsWith("/")) {
			name = "/" + name;
		}
		name = name.replace('.', '/');


		URL url = ClassTool.class.getResource(name);
		if (url == null) {
			return res;
		}
		File directory = new File(url.getFile());

		if (directory.exists()) {

			String[] files = directory.list();
			for (int i = 0; i < files.length; i++) {


				if (files[i].endsWith(".class")) {

					String classname = files[i].substring(0,
							files[i].length() - 6);
					try {
						String clsName = pckgname + "." + classname;
						logger.debug("clsName=" + clsName);
	
						Object o = Class.forName(clsName).newInstance();
						// if (o instanceof Class) {
						// System.out.println(classname);
						// }

						if (o instanceof Object) {
						}

						res.add(pckgname + "." + classname);
					} catch (ClassNotFoundException cnfex) {
						logger.error("getClasses(String)" + cnfex, cnfex);
					} catch (InstantiationException iex) {

					} catch (IllegalAccessException iaex) {

					}
				}
			}
		}

		return res;
	}


也许用得到
3 楼 jasongreen 2007-03-18  
ajoo 写道
理论上是不可能的。java的package是开放式的,同一个pacakge的类完全可以放在不同的地方。java并没有提供标准的可移植的方法来遍历class.


但是实际应用中,可以利用一些假设(比如,这个package的类都被deploy到一个jar或者一个目录下,这时候可以用zip或者File来读取这些类。)

具体实现参考Ant的junit task,或者http://www.openqa.org/jtc里面遍历类的方法。




very good,thank you very very much.
2 楼 Godlikeme 2007-03-18  
yes, I did the same way as ajoo said. ant is a good reference.
1 楼 ajoo 2007-03-18  
理论上是不可能的。java的package是开放式的,同一个pacakge的类完全可以放在不同的地方。java并没有提供标准的可移植的方法来遍历class.


但是实际应用中,可以利用一些假设(比如,这个package的类都被deploy到一个jar或者一个目录下,这时候可以用zip或者File来读取这些类。)

具体实现参考Ant的junit task,或者http://www.openqa.org/jtc里面遍历类的方法。


相关推荐

    Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件

    本文将深入探讨如何使用反射获取注解以及如何在Spring框架中获取特定包下的所有类文件。 首先,让我们看看如何通过反射获取注解。在Java中,注解是一种元数据,它提供了向编译器或JVM提供有关代码额外信息的方式。...

    Java中Class对象详解.docx

    1. **Class.forName(类名字符串)**: 这种方式通过传入类的全名(包括包名)作为参数,动态地加载并返回对应的Class对象。如果类尚未被加载到JVM,那么它会先进行加载。 2. **类名.class**: 这是一种更直接的方式,...

    Java动态获取实现某个接口下所有的实现类对象集合

    这篇文章将向大家分享如何使用 Java 反射机制和第三方工具包 org.reflections 来实现动态获取实现某个接口下所有的实现类对象集合。 首先,为什么我们需要动态获取实现某个接口下所有的实现类对象集合?在实际开发...

    Java中Class类工作原理详解

    1.Class对象 Class对象包含了与类相关的信息。事实上,Class对象就是用来创建类的所有的“普通”对象的。 类是程序的一部分,每...一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。看下面示例。

    通过java的反射技术获取,某个包路径下的类,并以表格形式打印类的属性注解注释及属性名称等

    获取到Class对象后,我们可以通过`getDeclaredFields()`方法获取类的所有声明的字段(包括私有字段)。对于每个Field对象,我们可以执行以下操作: 1. 获取字段名称:`Field.getName()` 2. 获取字段的注释:`Field....

    测量Java对象大小的demo

    本示例“测量Java对象大小的demo”提供了一种方法,通过使用Java的`java.lang.instrument`包来注入`javaagent`,进而利用`Instrumentation`接口测量Java对象的精确内存占用。下面我们将详细探讨这一过程。 首先,`...

    Classdir

    标题“Classdir”指的是一个可能存在于某个编程语言(如PHP)中的类库或函数,用于获取指定目录下所有子目录的列表。这个功能对于开发者来说非常实用,因为它可以帮助他们遍历文件系统,处理目录结构,或者进行文件...

    vue如何判断dom的class

    在上面的代码中,我们使用了 Vue 的模板语法来渲染一个列表,我们的目标是点击某个项目时,添加一个名为 `check` 的 class,然后获取含有这个 class 的 DOM 文件。 接下来,让我们来看一下 JavaScript 代码: ```...

    frida反射调用对象中的方法与字段.pdf

    - `getDeclaredFields`:这个方法可以用来获取对象的所有声明字段,包括公有、保护、默认(包)访问和私有字段,但不包括继承的字段。 - `getDeclaredMethods`:这个方法可以用来获取对象的所有声明方法,同样包括...

    C#利用反射来判断对象是否包含某个属性的实现方法

    要判断对象是否包含某个属性,我们首先需要获取该对象的`Type`对象,然后通过`Type`对象的`GetProperty`方法查找指定名称的属性。如果找到该属性,说明对象包含这个属性;否则,表示不包含。 下面是一个详细的过程...

    Class(类类型),Selector(选择器SEL),函数指针(IMP)

    每个类都有一个Class对象,可以通过`[[MyClass class] description];`来查看类的信息。类对象包含了类的名字、父类、实例变量布局、方法列表等元数据。Objective-C中的`Class`实际上是一个指向结构体的指针,这个...

    class16不明就里

    "class16"可能是某个特定的类的命名,它可能代表一类特定的对象或者有特定功能的代码块。类通常包含属性(变量)和方法(函数),用于封装数据和行为。理解类的构造、继承、多态和封装等概念是深入学习面向对象编程...

    java中遍历某个目录下的所有文件及文件夹中的文件

    ### Java中遍历某个目录下的所有文件及文件夹中的文件 在Java开发中,经常会遇到需要遍历指定目录及其子目录下所有文件的情况。本文将详细介绍如何使用Java标准库中的`java.io.File`类来实现这一功能。我们将通过一...

    类与对象练习题 带答案

    9. 为了使类中的某个成员不能被类的对象通过成员操作符访问,则不能把该成员的访问权限定义为( )。答案:A. public 知识点:类的访问权限 解释:public 访问权限使得成员可以被类的对象访问。 10. 通过指向...

    1-UFT对象的识别操作

    录制完成后,可以查看对象库,确认所有交互过的界面元素都被正确地识别并存储在对象库中。 2. **回放测试场景**:完成录制后,通过回放功能验证测试脚本的正确性。在回放过程中,观察应用程序的行为是否符合预期,...

    运行class

    如果`.class`文件位于某个目录结构下,需要提供完整的包路径,例如`java com.example.MyClass`。如果`test.sh`是一个Shell脚本,它可能包含了这些命令,以便简化和自动化运行过程。 4. **Shell脚本(test.sh)**: `...

    python实现class对象转换成json/字典的方法

    在Python编程中,有时我们需要将类(Class)对象转换为JSON格式或字典(Dictionary),以便于数据存储、传输或序列化。本文将详细介绍如何在Python中实现这一过程,并提供相应的示例代码。 首先,JSON(JavaScript ...

    DirectShow BaseClass

    4. **线程同步**:由于DirectShow可能在多个线程环境中运行,因此BaseClass包含了线程同步工具,如CriticalSection对象,确保在多线程环境下的数据安全。 5. **过滤器图管理**:在DirectShow中,过滤器图是连接各个...

    【05-面向对象(下)】

    •接口的继承和类继承不一样,接口完全支持多继承,子接口扩展某个父接口将会获得父接口的所有抽象方法,常 量属性,内部类和枚举类定义。 使用接口 •接口可以用于声明引用类型的变量,但接口不能用于...

    Class详解内部类等

    这种组合方式使得Java在单继承的限制下仍能实现多态性。 总之,Java的内部类提供了一种灵活的方式来组织和设计复杂的系统。通过熟练掌握内部类的使用,开发者可以编写出更加模块化、可读性强的代码,同时利用其特性...

Global site tag (gtag.js) - Google Analytics