java 查找类的所有子类

package _02;

import java.io.File;
import java.net.URL;

public class MainTest_FindAllSubClass {
	public static void main(String[] args) {

		Class<?> clazz = MainTest_FindAllSubClass.class;
		// 定位到当前的包路径
		// URL url = Toy.class.getResource("");

		// 定位到bin目录
		URL url = clazz.getResource("/");
		System.out.println(url);

		String fileName = url.getFile();
		System.out.println(fileName);

		String pathName = fileName.replaceFirst("/", "");
		System.out.println(pathName);

		File rootFile = new File(pathName);

		setSubList(rootFile, rootFile.getPath() + "\\", clazz);
	}

	/**
	 * 遍历bin目录下所有文件
	 * 若是文件夹,则递归将文件夹内文件添加到文件数组
	 * 若是文件,则将文件加载并强制类型转换为要查找子类的父类,转换无异常,说明加载类是父类的子类
	 * (当遍历到类自身时,此处认为也属于子类,当然这是我的一厢情愿,我肯定不告诉你--〉我嫌麻烦。。
	 * 	不过我还是加上了判断--〉自我要求比较高。。
	 * )
	 * */
	public static <T> void setSubList(File rootFile, String parentDirectory,
			Class<T> parentClass) {
		if (rootFile.isDirectory()) {
			File[] files = rootFile.listFiles();
			for (File file : files) {
				setSubList(file, parentDirectory, parentClass);
			}
		} else {
			String className = null;
			try {
				if (rootFile.getPath().indexOf(".class") != -1) {
					className = rootFile.getPath().replace(parentDirectory, "")
							.replace(".class", "").replace("\\", ".");
					Class<?> classObject = Class.forName(className);
					classObject.asSubclass(parentClass);

					// 要么是子类,要么是类本身
					if (! className.equals(parentClass.getCanonicalName())){
						System.out
						.println(className + " extends " + parentClass);
					}else{
						System.out
						.println(className + " is " + parentClass);
					}
				}
			} catch (ClassNotFoundException e) {
				System.err.println("can not find " + className);
			} catch (ClassCastException e) {
				System.err.println(className + " do not extends " + parentClass);
			}
		}
	}
}

// 测试
class Sub1 extends MainTest_FindAllSubClass {
}

//测试
class Sub2 extends MainTest_FindAllSubClass {
}

  

时间: 2024-08-05 18:10:29

java 查找类的所有子类的相关文章

JAVA 查找类的所有引用关系(python实现)

#!/usr/bin/env python import osimport sysimport os.path def find_import(line): line=line.strip() IMPORT_CMD="import " if not line.startswith(IMPORT_CMD): return None line=line[len(IMPORT_CMD):].strip() line=line.strip(';') parts=line.split("

分析Java的类加载器与ClassLoader(二):classpath与查找类字节码的顺序,分析ExtClassLoader与AppClassLoader的源码

先回顾一下classpath classpath的作用: classpath的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从classpath中进行查找这个类. 指定classpath的方式一:         设置环境变量CLASSPATH,多个路径之间使用英文的分号隔开,也可以指定为jar包路径.          示例:CLASSPATH=c:/myclasses/;c/mylib/aa.jar;c:/mylib/bb.jar;.          注意

java异常类子类和父类的关系

在java 中,当我们子类要重写父类中的方法,如果父类的方法有异常声明,那么子类重写这个方法时候,所要声明的异常不应该比父类的大.只能是小等,或者可以没有.原因如下.假如我们自定意义一个异常: public class MyException extends Exception {public MyException(String message) {}public MyException() {}} 那么我们有一个父类它将有一个方法,将声明抛出这个异常.我们把它做成抽象的(无所谓) publi

java查找重复类/jar包/普通文件

开发web应用时,有时更新了类却没有生效,其实是因为jboss/tomcat中其他发布包下有同名类(包括全路径都相同). 于是萌发了做个程序来检查指定目录是否存在重复类(通过asm从类文件中取类的全路径),扩展开来,还支持查找重复的文件(按文件md5进行比较),重复的jar文件. 主要代码如下: 简单测试代码: package cn.jerryhouse.util.dup_files.test; import java.io.File; import org.junit.Test; import

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

Java虚拟机类装载的原理及实现(转) 一.引言 Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程.JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行.本文将分析JVM中的类装载系统,探讨JVM中类装载的原理.实现以及应用. 二.Java虚拟机的类装载实现与应用 2.1 装载过程简介 所谓装载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的c

Java 反射 类的连接与初始化 [ 转载 ]

Java类的连接与初始化 (及2013阿里初始化笔试题解析) 转自http://www.cnblogs.com/iceAeterNa/p/4876747.html Java虚拟机通过装载.连接.初始化来使得一个Java类型可以被Java程序所使用,如下图所示,其中连接过程又分为验证.准备.解析三个部分.其中部分类的解析过程可以推迟到程序真正使用其某个符号引用时再去解析.   解析过程可以推迟到类的初始化之后再进行,但这是有条件的,Java虚拟机必须在每个类或接口主动使用时进行初始化. 以下为主动

Java异常类

原文出自:http://blog.csdn.net/hguisu/article/details/6155636  在原文的基础上做优化和编辑. 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常.因而,Java异常都是对象,是Throwable子类的实例,描述了出现在一段编码中的 错误条件.当条件生成时,错误将引发异常. Java异常类层次结构图:

Java Class类理解

Java Class类理解: 首先,Class是一个java类,跟Java API中定义的诸如Thread.Integer类.我们自己定义的类是一样,也继承了Object(Class是Object的直接子类).总之,必须明确一点,它其实只是个类,只不过名字比较特殊.更进一步说,Class是一个java中的泛型类型. 对于我们自己定义的类,我们用类来抽象现实中的某些事物,比如我们定义一个名称为Car的类来抽象现实生活中的车,然后可以实例化这个类,用这些实例来表示我的车.你的车.黄的车.红的车等等.

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中