JAVA获取同一路径下所有子类或接口实现类
2014-10-20 14:16
656 查看
JAVA获取同一路径下所有子类或接口实现类整个测试代码如下:
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
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
相关文章推荐
- JAVA获取同一路径下所有子类或接口实现类
- JAVA获取同一路径下所有子类或接口实现类
- JAVA获取同一路径下所有子类或接口实现类
- JAVA获取同一路径下所有子类或接口实现类
- JAVA获取同一路径下所有子类或接口实现类
- JAVA获取同一路径下所有子类或接口实现类
- JAVA-获取实现了指定接口类的所有实现类或继承了指定类的所有子类
- Java动态获取某个接口下所有的实现类对象集合
- Java动态获取某个接口下所有的实现类对象集合
- Java -- 获取指定接口的所有实现类或获取指定类的所有继承类
- java反射获取某接口的所有实现类
- Java动态获取某个接口下所有的实现类对象集合
- Java中如何获得所有实现该接口的子类
- Java 获取接口所有实现类
- Java实现获取Web上所有路径下资源文件的URL地址
- Java根据包名获取指定接口的所有实现
- Java中实现获取路径的方法汇总
- Java实现:在二元树中找出和为某一值的所有路径
- Java-列出一个类实现的所有接口
- java 获取当前路径下的所有xml文档