整个测试代码如下:
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中通过接口和抽象类实现。接口是一种完全抽象的类型,它只包含常量和抽象方法,可以被多个类实现。实现接口的类必须提供接口中所有方法的具体实现。抽象类则...