package find; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import find.test.Intf; import find.test.Man; public class ClassUtil { public static void main(String[] args) { try { System.out.println("接口实现类:"); for (Class<?> c : getAllAssignedClass(Intf.class)) { System.out.println(c.getName()); } System.out.println("子类:"); for (Class<?> c : getAllAssignedClass(Man.class)) { System.out.println(c.getName()); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获取同一路径下所有子类或接口实现类 * * @param intf * @return * @throws IOException * @throws ClassNotFoundException */ public static List<Class<?>> getAllAssignedClass(Class<?> cls) throws IOException, ClassNotFoundException { List<Class<?>> classes = new ArrayList<Class<?>>(); for (Class<?> c : getClasses(cls)) { if (cls.isAssignableFrom(c) && !cls.equals(c)) { classes.add(c); } } return classes; } /** * 取得当前类路径下的所有类 * * @param cls * @return * @throws IOException * @throws ClassNotFoundException */ public static List<Class<?>> getClasses(Class<?> cls) throws IOException, ClassNotFoundException { String pk = cls.getPackage().getName(); String path = pk.replace('.', '/'); ClassLoader classloader = Thread.currentThread().getContextClassLoader(); URL url = classloader.getResource(path); return getClasses(new File(url.getFile()), pk); } /** * 迭代查找类 * * @param dir * @param pk * @return * @throws ClassNotFoundException */ private static List<Class<?>> getClasses(File dir, String pk) throws ClassNotFoundException { List<Class<?>> classes = new ArrayList<Class<?>>(); if (!dir.exists()) { return classes; } for (File f : dir.listFiles()) { if (f.isDirectory()) { classes.addAll(getClasses(f, pk + "." + f.getName())); } String name = f.getName(); if (name.endsWith(".class")) { classes.add(Class.forName(pk + "." + name.substring(0, name.length() - 6))); } } return classes; } }
运行结果如下:
接口实现类:
find.test.impl.IntfImpl2 find.test.IntfImpl 子类: find.test.BadMan find.test.impl.GoodMan 目录接口如下: src |----find |----ClassUtil.java |----test |----BadMan.java |----impl | |----GoodMan.java | |----IntfImpl2.java |----Intf.java |----IntfImpl.java |----Man.java
相关推荐
这个类中有一个 `getAllAssignedClass` 方法,用于获取同一路径下所有子类或接口实现类。这个方法使用 `getClasses` 方法来获取当前类路径下的所有类,然后过滤出继承自 `com.post.common.BaseAction` 的类。 ...
动态类加载机制的核心在于`java.lang.ClassLoader`类及其子类。开发者可以通过重写`loadClass(String className)`方法来自定义加载逻辑。当调用`Class.forName()`或`ClassLoader.loadClass()`时,JVM会使用类加载器...
在JVM中,类的装载是由`ClassLoader`及其子类实现的。`ClassLoader`是Java运行时系统的一个核心组件,负责查找和装入类文件。 - **`ClassLoader`**:这是Java中的一个抽象类,定义了几个关键的方法来支持类的装载。...
它是子类 `ClassLoader` 需要重写的关键方法之一,目的是实现类的自定义加载逻辑。 3. **`defineClass` 方法**: - `defineClass` 方法用于将字节码转换为 `Class` 对象。它处理了许多复杂的内部细节,例如解析...
集合框架是Java处理对象组的一种方式,包括List、Set和Map等接口,以及ArrayList、HashSet、HashMap等实现类。理解这些集合的特点和使用场景,是提升编程效率的关键。 七、IO流 Java的输入/输出(IO)流系统支持对...
10. **多线程**:Java内置对多线程的支持,通过Thread类或Runnable接口实现并发执行。同步机制如synchronized关键字、wait/notify机制防止并发问题。 11. **网络编程**:Java提供了丰富的网络编程API,如Socket和...
`Collection`接口是最基本的容器接口,所有的单列集合类都是它的实现类。`Collection`接口的主要子接口有`Set`和`List`。 - **Collection接口常用方法** `Collection`接口定义了一些基本的方法,如`add()`、`...
多态是指同一种行为可以有不同的表现形式,这在Java中通过接口和抽象类实现。 5. **异常处理**:Java使用try-catch-finally语句块进行异常处理,使得程序在遇到错误时能优雅地处理,而不是突然崩溃。 6. **集合...
- **集合类层次**:`List`、`Set`、`Map`等接口的具体实现类。 - **五个最常用的集合类之间的区别和联系**:ArrayList、LinkedList、HashSet、TreeSet、HashMap。 - **比较**:根据具体需求选择合适的集合类。 **...
Java集合框架包括List、Set、Queue等接口及其实现类,如ArrayList、HashSet、LinkedList等,它们提供了存储和操作对象的高效工具。 六、设计模式 面向对象设计模式是解决常见问题的最佳实践,如单例模式、工厂模式...
接口可以被类实现,实现类必须提供接口中所有方法的具体实现。接口可以看作是类之间的一种约定,规定了某些方法的行为规范。 #### 七、Java反射机制 - **反射**:Java反射机制允许在运行时获取类的信息(如字段、...
在Java编程中,数据库连接是通过Java Database Connectivity (JDBC) API实现的,它提供了一组接口和类,使得Java程序能够与各种数据库进行交互。然而,不同的数据库版本可能需要不同版本的JDBC驱动,这可能导致兼容...
public允许所有类访问,private限制在同一类内访问,protected允许同一包内及子类访问,而默认修饰符只允许同一包内的类访问。 Java多线程编程主要通过实现Runnable接口或继承Thread类来创建线程。Java泛型提高了...
Java中的所有异常都继承自Throwable类,它有两个主要子类:Error和Exception。Error表示严重的错误,通常是系统错误,而Exception则表示可恢复的错误。通过try、catch、finally语句和throws关键字,可以对异常进行...
- 继承`Thread`类或实现`Runnable`接口。 3. **两种进程创建方式比较** - 继承`Thread`类可以直接访问和修改线程属性。 - 实现`Runnable`接口更灵活,可以被多个线程共享。 4. **线程的生命周期** - 线程的...
* 历史原因:Hashtable 基于陈旧的 Dictionary 类,HashMap 是 Java 1.2 引进的 Map 接口的一个实现 * 同步性:Hashtable 是线程安全的,HashMap 是线程不安全的 * 值:只有 HashMap 可以让你将空值作为一个表的条目...
7. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口,以及ArrayList、HashSet、LinkedList、HashMap等实现类,用于存储和管理对象。理解它们的区别和应用场景是Java编程的关键。 8. **输入输出流**:...
多态性则是指同一种行为可以有不同的表现形式,这在Java中通过接口和抽象类实现。接口是一种完全抽象的类型,它只包含常量和抽象方法,可以被多个类实现。实现接口的类必须提供接口中所有方法的具体实现。抽象类则...