java 接口 实现类 如何编写代码: 由接口知道所有其实现类?比如有Fruit这个接口实现这个接口的有:Apple,Orange,等等如何通过编写代码由Fruit就可以知道所有其实现的子类? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 类的信息包含在Class对象中,这个能实现吗?关注中..... 都说CSDN上高手很多,为什么我每次发帖都没什么人回答我的问题呢?哎。。 想想 父类怎么知道有多少子类实现了自己。 但是子类知道自己实现了什么接口或继承了哪个父类。因为在子类中会用implement来标记子类的父类是谁。 把实现这个借口放在一起,可以配置在一起,可以放在一个类中,或者一个对象中,个人感觉配置好一些可以这样配放置在xml里<property name="Fruit"> <list> <value>Apple</value> <value>Orange</value> </list></property> 我的需求是这样的:有Fruit这个接口,实现这个接口的子类有多个另外我建了个FruitFactory这个类我想让这个工厂自己去制造具体的水果比如我想制造100个水果,我不想一个一个去实例化工厂随机制造出100个就可以了所以我就要知道实现Fruit这个接口的子类有哪几种了? 大家看看这样实现有什么问题?代码在这里:(代码比较乱,大家将就点好不看看)package com.sun;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(); //获得当前的包名 System.out.println("包名"+ packageName); try { List<Class> allClass = getClasses(packageName); //获得当前包下以及包下的所有类 System.out.println("allClasses.size = " + allClass.size()); //判断是否是同一个接口 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; } //从一个包中查找出所有的类,在jar包中还不能实现查找 private static List<Class> getClasses(String packageName) throws ClassNotFoundException,IOException { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); String path = packageName.replace('.','/'); //System.out.println("path="+path); 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)); System.out.println("classes"); } 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; } } spring发送邮件出错 该怎么学习现有的代码? spring security问题 大侠们帮帮忙 hibernate查询返回list的问题! 请问hibernate可以用于Java桌面应用吗? 在struts中,我用这种方式怎么不能正确显示图象呢? 使用javacomm用电脑连接手机发送短消息的程序在jbuilder测试环境下可以,但是移植到tomcat下就不行,为什么? 发布EAR包的问题 ie8 如何使用base标签,好像不起作用。 java JDBC运行sql语句时报错 刚学ibatis,遇到一个插入问题 大过年的,散分
哎。。
可以这样配放置在xml里<property name="Fruit">
<list>
<value>Apple</value>
<value>Orange</value>
</list>
</property>
有Fruit这个接口,实现这个接口的子类有多个
另外我建了个FruitFactory这个类
我想让这个工厂自己去制造具体的水果
比如我想制造100个水果,我不想一个一个去实例化
工厂随机制造出100个就可以了所以我就要知道实现Fruit这个接口的子类有哪几种了?
代码在这里:(代码比较乱,大家将就点好不看看)
package com.sun;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();
//获得当前的包名
System.out.println("包名"+ packageName);
try
{
List<Class> allClass = getClasses(packageName);
//获得当前包下以及包下的所有类
System.out.println("allClasses.size = " + allClass.size());
//判断是否是同一个接口
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;
}
//从一个包中查找出所有的类,在jar包中还不能实现查找
private static List<Class> getClasses(String packageName)
throws ClassNotFoundException,IOException
{
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
String path = packageName.replace('.','/');
//System.out.println("path="+path);
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));
System.out.println("classes");
}
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;
}
}