`
tianlihu
  • 浏览: 313142 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

获取类的所有子类

阅读更多
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import javax.swing.JOptionPane;

import com.ibm.frameworks.industrial.studio.kpi.util.ExceptionUtil;

public class ClassLoaderUtil {
	
	public synchronized static void reloadClassesFromPath() {
		isLoad = false;
		loadClassesFromPath();
	}

	public synchronized static void loadClassesFromPath() {
		if (!isLoad) {
//			String property = System.getProperty("user.dir");// "sun.boot.class.path"
			try {
				URL resource = ClassLoaderUtil.class.getResource("/");
				URI uri = resource.toURI();
				String property = new File(uri).getPath();
				String[] paths = property.split(";");
				for (String path : paths) {
					File file = new File(path);
					if (file.isFile() && path.endsWith(".jar")) {
						listClassesInZip(file);
					} else if (file.isDirectory()) {
						listClassesInDirectory(path + File.separatorChar, file);
					}
				}
			} catch (URISyntaxException e) {
				JOptionPane.showMessageDialog(null, ExceptionUtil.getExceptionMessage(e));
			}
		}
	}

	private synchronized static void listClassesInDirectory(String rootPath, File file) {
		File[] subFiles = file.listFiles();
		for (File subFile : subFiles) {
			if (subFile.canRead()) {
				if (subFile.isFile()) {
					String path = subFile.getPath();
					if (path.endsWith(".class")) {
						try {
							String className = getClassName(path.substring(rootPath.length()));
							CLASSES.add(Class.forName(className));
						} catch (Throwable e) {
						}
					} else if (path.endsWith(".jar")) {
						listClassesInZip(subFile);
					}
				} else if (subFile.isDirectory()) {
					listClassesInDirectory(rootPath, subFile);
				}
			}
		}
	}

	private synchronized static void listClassesInZip(File jarFile) {
		ZipInputStream in = null;
		try {
			in = new ZipInputStream(new FileInputStream(jarFile));
			ZipEntry ze = null;
			while ((ze = in.getNextEntry()) != null) {
				if (ze.isDirectory()) {
					continue;
				} else {
					try {
						String name = ze.getName();
						if (!name.endsWith(".class"))
							continue;
						String className = getClassName(name);
						CLASSES.add(Class.forName(className));
					} catch (Throwable e) {
					}
				}
			}
		} catch (Throwable e) {
		} finally {
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
				}
			}
		}
	}

	private static String getClassName(String path) {
		return path.replace('/', '.').replace('\\', '.').replaceAll(".class", "");
	}

	public static List<Class<?>> getSubClasses(Class<?> clazz) {
		List<Class<?>> subClasses = SUB_CLASSES_MAP.get(clazz);
		if (subClasses == null) {
			subClasses = new ArrayList<Class<?>>(10);
			for (Class<?> tmpClass : CLASSES) {
				if (clazz.isAssignableFrom(tmpClass) && !tmpClass.isAssignableFrom(clazz)) {
					subClasses.add(tmpClass);
				}
			}
			SUB_CLASSES_MAP.put(clazz, subClasses);
		}
		return Collections.unmodifiableList(subClasses);
	}

	private static final List<Class<?>> CLASSES = new ArrayList<Class<?>>(200);

	private static final Map<Class<?>, List<Class<?>>> SUB_CLASSES_MAP = new HashMap<Class<?>, List<Class<?>>>();

	private static boolean isLoad;

	static {
		loadClassesFromPath();
	}
}
1
0
分享到:
评论
1 楼 xu3352 2011-08-12  
很好

相关推荐

    java反射获取所有属性,获取所有get方法,包括子类父类

    在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细介绍这些内容。 1. **获取所有属性**: 在Java中,`java.lang.Class` 类提供了获取类属性的方法。...

    获取同一个程序集下一个类的所有子类,及类的相关信息

    首先,要获取同一程序集中的所有类,你需要加载该程序集。这可以通过`System.Reflection.Assembly.Load`或`System.Reflection.Assembly.LoadFrom`方法完成,传入程序集的路径作为参数。例如: ```csharp Assembly ...

    在父类获取子类属性

    在Java编程语言中,"在父类获取子类属性"是一个常见的需求,特别是在设计模式、继承和多态性等核心概念的应用中。这个主题涉及到面向对象编程的基本原理,特别是子类继承父类后如何访问和操作子类特有的属性。下面...

    JAVA获取同一路径下所有子类或接口实现类

    - `getAllAssignedClass()`方法通过遍历`getClasses()`返回的所有类,判断每个类是否是目标类(接口或父类)的子类或实现了目标接口,符合条件的加入到结果列表。 通过这段代码,我们可以获取到指定路径下所有实现...

    java中获取泛型类的子类

    通过反射获得指定类的父类的泛型参数的实际类型

    递归拿到所有子类的id

    List list2 = new ArrayList(); public List getAll(String i,List&lt;Student&gt; list){ Iterator iter = list.iterator(); while(iter.hasNext()){ Student student = (Student)iter.next();...

    C# 遍历Dll文件中的所有子类 Demo

    在某些情况下,我们需要动态地加载DLL(动态链接库)文件,并遍历其中定义的所有类,以便进行插件式开发或者进行类型检查。本示例将详细解释如何在C#中实现这个功能。 首先,我们要理解DLL文件的本质。DLL是包含可...

    swift-在Objective-C下获取app的所有的类的列表

    获取所有类的列表主要通过以下步骤: 1. 引入Foundation框架:Objective-C的反射功能主要在Foundation框架中,因此我们需要在代码中引入该框架。 ```objc #import ``` 2. 获取所有已注册的类:通过`objc_...

    JAVA读取同一路径下所有类及其方法

    在 Java 中,获取同一路径下所有类及其方法是非常重要的,这样才能对权限进行控制。在本文中,我们将提供一种获取所有类及其方法的方法。 获取同一路径下所有类及其方法 在开发内部可视化系统的“系统功能-功能...

    Yii Framework框架获取分类下面的所有子类方法

    获取分类下面的所有子类方法: static function getMenuTree($arrCat, $parent_id = 0, $level = 0,$all=True) { static $arrTree; //使用static代替global if(!$all) $arrTree =''; if( empty($arrCat)) ...

    php递归获取子级,父级,无限极分类,带demo,效率超高

    通过递归,我们可以获取到任何节点的所有父级路径,也可以获取到某个节点的所有子节点。 4. **效率**: 高效的无限级分类算法需要考虑内存消耗和计算时间。通常,使用预排序遍历树(Preorder Traversal)或后序...

    php获取子级,父级,无限极分类,带demo,效率超高

    php获取子级,父级,无限极分类,带demo,效率超高。下载请评价,谢谢!!!买到就是赚到,一直在用

    易语言窗口子类化例程

    这个子程序可能包含了以上提到的所有步骤,实现了窗口的子类化功能。 通过以上介绍,我们可以理解易语言窗口子类化例程是如何工作的,以及如何在实际项目中应用这一技术。对于易语言的开发者来说,掌握窗口子类化...

    WPF继承_子类继承父类,实现跨类调用方法

    - 子类继承父类后,将自动获得所有非私有(public或protected)成员,包括属性、方法和事件。 2. **WPF中的UI元素继承** - WPF的UI元素类层次结构是基于`System.Windows.UIElement`和`System.Windows....

    用VB进行子类化

    子类化(subclassing)是Windows编程中的一个重要概念和技术,尤其在使用Visual Basic (VB)进行开发时,它允许开发者对现有的窗口类进行扩展或修改其行为。在Windows环境下,所有的图形界面都是基于消息传递的原理来...

    VB6史无前例的子类化之透明按钮

    子类化的基本概念是创建一个新类,这个类继承自原有的控件类,然后重写或扩展其部分方法和属性。在VB6中,我们通常通过以下步骤实现子类化: 1. 创建一个新的用户控件(User Control)。 2. 在新的用户控件中添加一...

    基对象引用子类实例(C# 形象说明:父母可以代表孩子做很多事情)

    基类是定义了一组属性、方法和行为的类,而子类是从基类派生出来的,它继承了基类的所有特性,并且可以添加新的属性和方法或重写已有的。在C#中,使用`:`符号来表示继承,如`class DerivedClass : BaseClass`。 在...

    在spring中获取代理对象代理的目标对象工具类

    2. **CGLIB代理**:当目标对象没有实现接口时,Spring会使用CGLIB库来创建代理对象,这种方式会生成一个目标类的子类。 ### 自定义工具类:AopTargetUtils 为了方便地获取代理对象背后的目标对象,我们可以创建一...

    树父节点递归获取树子节点

    接着,我们创建一个工具类,包含一个方法用于递归获取所有子节点。这个方法接受父节点作为参数,并返回一个包含所有子节点的列表。为了实现递归,我们会在方法内部调用自身,对每个子节点继续获取其子节点,直到遍历...

Global site tag (gtag.js) - Google Analytics