`
小小虾001
  • 浏览: 9835 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

查找同一包下实现了接口的所有的类

 
阅读更多
package com.cbf4file;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class ClassUtils {


public static List<Class> getAllClassByInterface(Class c){
List<Class> returnClassList = new ArrayList<Class>();

if(c.isInterface()){
String packageName = c.getPackage().getName();
try{
List<Class> allClass = getClasses(packageName);
for(int i=0; i<allClass.size(); i++){
if(c.isAssignableFrom(allClass.get(i))){
if(!c.equals(allClass.get(i))){
returnClassList.add(allClass.get(i));
}
}
}
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}
return returnClassList;
}





public static List<Class> getClasses(String packageName) throws ClassNotFoundException,IOException{

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String path = packageName.replace(".", "/");

Enumeration<URL> resources = classLoader.getResources(path);
List<File> dirs = new ArrayList<File>();
while(resources.hasMoreElements()){
URL resource = resources.nextElement();
dirs.add(new File(resource.getFile()));
}
ArrayList<Class> classes = new ArrayList<Class>();
for(File directory :dirs){
classes.addAll(findClasses(directory,packageName));
}
return classes;
}

private static List<Class> findClasses(File directory,String packageName) throws ClassNotFoundException{

List<Class> classes = new ArrayList<Class>();
if(!directory.exists()){
return classes;
}

File[] files = directory.listFiles();
for(File file : files){
if(file.isDirectory()){
assert !file.getName().contains(".");
classes.addAll(findClasses(file,packageName+"."+file.getName()));
}else if(file.getName().endsWith(".class")){
classes.add(Class.forName(packageName+"."+file.getName().substring(0,file.getName().length() -6)));
}
}
return classes;
}

}
分享到:
评论

相关推荐

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

    在Java编程中,有时我们需要获取特定路径下所有实现了某个接口或者继承了某个类的子类。这个场景在大型项目中尤为常见,例如进行组件扫描、依赖注入或是单元测试时。在给定的代码示例中,它展示了如何通过Java来实现...

    Java技术----实现JAVA的动态类载入机制

    `java.lang.reflect`包提供了`Class`类、`Constructor`类、`Method`类和`Field`类等,它们分别代表Java类、构造器、方法和字段。通过`Class.forName()`可以获取到一个类的`Class`对象,然后可以进一步创建实例、访问...

    C++数据结构等价类实现

    等价类的概念源于集合论,指的是在某个特定的条件下,所有元素都可以相互替代的一组元素。在数据结构中,这通常表现为一组具有相同性质的对象,例如,图中的连通分量、排序数组中的连续相同值等。在C++中实现等价类...

    Collection E、Map K,V接口底层实现类数据结构的区别和联系.pdf

    List接口下的集合特点是有序的,可以包含重复元素,并且可以通过索引进行访问。Set接口下的集合特点是不允许重复元素的插入,保证了元素的唯一性。Map,V&gt;接口则是键值对集合的根接口,它包含了一组键值对,每个键...

    Node.js-实现列出本地局域网上的所有IP

    通过理解和应用以上知识,开发者能够利用Node.js在本地局域网环境下查找并显示所有活动的IP地址,这对于网络诊断、设备发现或者构建本地网络服务非常有用。例如,它可以用于自动化脚本,自动识别和连接到同一网络的...

    Java4Android 27_包和访问权限(三)

    还可以使用通配符`*`来导入整个包下的所有类,如: ```java import com.example.myapp.*; ``` 这样,包内的所有公共类都可以在当前源文件中直接使用。 总结,理解和掌握Java中的包和访问权限对于编写高效、可维护的...

    设计模式1

    3.继承这个接口的类必须实现接口的所有方法,且必须为public实现:当一个类实现接口时,它必须提供接口中所有方法的具体实现。这些实现的方法必须是public的,因为接口中的方法默认就是public的,这符合接口的契约...

    C# winForm实现查找局域网在线主机

    `NetworkInterface.GetAllNetworkInterfaces()`方法返回所有网络接口的信息,通过遍历这些接口,比较其IP地址,找出对应于在线IP的MAC地址: ```csharp foreach (NetworkInterface nic in NetworkInterface....

    EclipsePlugin开发深入理解查找Search功能及其扩展点归类.pdf

    此外,开发者还需要实现一些关键接口和类,如`ISearchQuery`(定义查找查询的行为)、`ISearchResultGroup`(组织查找结果)和`ISearchResultListener`(监听查找结果的变化)。Eclipse还提供了`IResultSetAction`和...

    C++模版类实现顺序表、单链表、双链表

    在这个“C++模版类实现顺序表、单链表、双链表”的工程包中,我们将深入探讨如何利用模版类来创建线性表的数据结构,并实现面向对象的设计原则,如类封装和多态。 首先,顺序表是一种存储结构,其中元素在内存中是...

    Java语言程序设计教程-雷学生-电子教案-204

    同一包内的类可以访问彼此的非私有成员,而不同包的类访问权限则受到限制。通过合理的访问控制,可以实现类的封装和安全。 6.2 接口 接口(Interface)在Java中是一种完全抽象的类型,它定义了一组方法签名,但不...

    Java虚拟机类装载的原理及实现

    - **装载**:查找并导入类或接口的二进制数据。 - **链接**:此步骤进一步细分为校验、准备和解析三个子步骤。 - **校验**:确保导入的类或接口的二进制数据格式符合JVM的要求。 - **准备**:为类的静态变量分配...

    Java加载。jar包

    - `findClass` 方法是用于查找类的具体实现方法。它是子类 `ClassLoader` 需要重写的关键方法之一,目的是实现类的自定义加载逻辑。 3. **`defineClass` 方法**: - `defineClass` 方法用于将字节码转换为 `...

    B+ tree的java实现

    B+树的特点是平衡性、分层结构和所有叶子节点在同一层,这使得它在处理大量数据时具有较高的查找、插入和删除效率。下面将详细讨论如何用Java实现B+树。 首先,B+树的节点分为两种类型:内部节点(或索引节点)和...

    继承和多态笔记.docx

    - 实现接口的类必须提供接口中所有方法的具体实现。 - 接口中声明的变量默认为`public static final`。 - 接口中定义的方法默认为`public abstract`。 - **用途**: - 提供一种机制,使得不同类可以共享行为。 ...

    jndi所依赖的jar包

    3. `jndi.jar`:这是JNDI的主要库文件,包含了JNDI API的实现,包括核心接口如`InitialContext`和`NamingManager`,以及其他的命名和目录操作类。将`jndi.jar`复制到`%JAVA_HOME%\jre\lib\ext`目录下,意味着将其...

    9秒学院C++模版类实现单链表

    需要注意的是,由于模版类的特殊性,其定义和实现通常需要在同一文件中,因为编译器需要在编译时知道模版类的具体类型。因此,不同于一般的非模版类,模版类的实现不能放在`.cpp`文件中,而应该放在`.txt`或其他能够...

    Java入门笔记4_访问控制和包

    4. **`private`**:表示私有,仅限于在声明它的类内部访问,即使是在同一包内的其他类也不能访问。 #### 重载与访问级别 当子类重载父类的方法时,子类中方法的访问级别不应低于父类方法的访问级别。例如,如果...

Global site tag (gtag.js) - Google Analytics