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();
}
}
分享到:
相关推荐
在标题和描述中提到的知识点主要集中在如何通过反射获取类的所有属性和get方法,包括来自子类和父类的。下面将详细介绍这些内容。 1. **获取所有属性**: 在Java中,`java.lang.Class` 类提供了获取类属性的方法。...
在Java编程语言中,"在父类获取子类属性"是一个常见的需求,特别是在设计模式、继承和多态性等核心概念的应用中。这个主题涉及到面向对象编程的基本原理,特别是子类继承父类后如何访问和操作子类特有的属性。下面...
首先,要获取同一程序集中的所有类,你需要加载该程序集。这可以通过`System.Reflection.Assembly.Load`或`System.Reflection.Assembly.LoadFrom`方法完成,传入程序集的路径作为参数。例如: ```csharp Assembly ...
- `getAllAssignedClass()`方法通过遍历`getClasses()`返回的所有类,判断每个类是否是目标类(接口或父类)的子类或实现了目标接口,符合条件的加入到结果列表。 通过这段代码,我们可以获取到指定路径下所有实现...
通过反射获得指定类的父类的泛型参数的实际类型
List list2 = new ArrayList(); public List getAll(String i,List<Student> list){ Iterator iter = list.iterator(); while(iter.hasNext()){ Student student = (Student)iter.next();...
在某些情况下,我们需要动态地加载DLL(动态链接库)文件,并遍历其中定义的所有类,以便进行插件式开发或者进行类型检查。本示例将详细解释如何在C#中实现这个功能。 首先,我们要理解DLL文件的本质。DLL是包含可...
获取所有类的列表主要通过以下步骤: 1. 引入Foundation框架:Objective-C的反射功能主要在Foundation框架中,因此我们需要在代码中引入该框架。 ```objc #import ``` 2. 获取所有已注册的类:通过`objc_...
在 C# 中,父类(也称为基类或超类)是定义了一组属性和方法的类,而子类(也称为派生类)是从父类继承并可能添加更多特性的类。通过继承,子类可以重用父类的代码,同时扩展其功能。 当需要将父类的对象赋值给子类...
在 Java 中,获取同一路径下所有类及其方法是非常重要的,这样才能对权限进行控制。在本文中,我们将提供一种获取所有类及其方法的方法。 获取同一路径下所有类及其方法 在开发内部可视化系统的“系统功能-功能...
获取分类下面的所有子类方法: static function getMenuTree($arrCat, $parent_id = 0, $level = 0,$all=True) { static $arrTree; //使用static代替global if(!$all) $arrTree =''; if( empty($arrCat)) ...
通过递归,我们可以获取到任何节点的所有父级路径,也可以获取到某个节点的所有子节点。 4. **效率**: 高效的无限级分类算法需要考虑内存消耗和计算时间。通常,使用预排序遍历树(Preorder Traversal)或后序...
php获取子级,父级,无限极分类,带demo,效率超高。下载请评价,谢谢!!!买到就是赚到,一直在用
这个子程序可能包含了以上提到的所有步骤,实现了窗口的子类化功能。 通过以上介绍,我们可以理解易语言窗口子类化例程是如何工作的,以及如何在实际项目中应用这一技术。对于易语言的开发者来说,掌握窗口子类化...
- 子类继承父类后,将自动获得所有非私有(public或protected)成员,包括属性、方法和事件。 2. **WPF中的UI元素继承** - WPF的UI元素类层次结构是基于`System.Windows.UIElement`和`System.Windows....
子类化(subclassing)是Windows编程中的一个重要概念和技术,尤其在使用Visual Basic (VB)进行开发时,它允许开发者对现有的窗口类进行扩展或修改其行为。在Windows环境下,所有的图形界面都是基于消息传递的原理来...
子类化的基本概念是创建一个新类,这个类继承自原有的控件类,然后重写或扩展其部分方法和属性。在VB6中,我们通常通过以下步骤实现子类化: 1. 创建一个新的用户控件(User Control)。 2. 在新的用户控件中添加一...
基类是定义了一组属性、方法和行为的类,而子类是从基类派生出来的,它继承了基类的所有特性,并且可以添加新的属性和方法或重写已有的。在C#中,使用`:`符号来表示继承,如`class DerivedClass : BaseClass`。 在...
2. **CGLIB代理**:当目标对象没有实现接口时,Spring会使用CGLIB库来创建代理对象,这种方式会生成一个目标类的子类。 ### 自定义工具类:AopTargetUtils 为了方便地获取代理对象背后的目标对象,我们可以创建一...