Java 反射机制
我需要找出一个类是否实现了一个特定的接口(假设java.io.Serializable) 下面是我的代码Java 反射机制,java,Java,我需要找出一个类是否实现了一个特定的接口(假设java.io.Serializable) 下面是我的代码 class Employee{},class Test implements java.io.Serializable{},class Point{}, class Main{}, class MyApp{},class TestApp implements java.io.Serializable{}; class MyMain { public static void main(Str
class Employee{},class Test implements java.io.Serializable{},class Point{},
class Main{}, class MyApp{},class TestApp implements java.io.Serializable{};
class MyMain
{
public static void main(String[] args)
{
String[] classes={"Employee","Test","Point","Main","MyApp"}; // array of class names in default package
Class interFace = Class.forName("java.io.Serializable");
for(int i=0 ;i < classes.length;i++) {
Class clas = Class.forName(classes[i]);
boolean match = !clas.isInterface() && !clas.isEnum() && interFace.isAssignableFrom(clas) ;
if(match )
{
System.out.println(classes[i]+ "implements java.io.Serializable");
}}}}
公共类ClassImplementer{
私有列表GetClass(字符串路径、字符串接口名)引发异常{
列表=新的ArrayList();
if(path.endsWith(“.jar”)){
List l=JarUtils.getClasseNameInjar(路径);
如果(l!=null&&l.size()也许您提供了完整的、可编译的源代码(您在哪里捕获异常?),这样就可以发现代码中的错误
编辑
我看不出任何明显的东西。因为其他人都有正确的结果-也许你只是在处理一个过时的“jar”文件?删除并用当前版本的测试类重新创建。你的程序与你的输出不匹配。当我纠正代码中的错误时,我得到一个输出
Testimplements java.io.Serializable
对于您的程序来说,这似乎是正确的。假设粘贴到注释中的代码是您的实际代码,那么问题在于:
(从类内部)
for(int i=0;iWhy)它们在默认包中?根本不需要使用默认包,在所有实际代码中都应该严格避免使用默认包。@skaffman-“只有Employee和Main类在默认包中时才有问题。”试图复制,但没有成功。布尔表达式在我的机器上正常工作,不管类包是什么。@andreas\u d也许我有点笨。你是否设法编译了这些东西而不做任何更改?所以我相信问题出在遗漏的部分…@mtraut-不,我只是查看了代码并测试了条件。它解决了问题对于未实现此接口的任何类,将ves设置为false
。对于某些奇怪的情况,此代码的其余部分不负责match
变为true。仅对此进行扩展:类定义后的逗号是语法错误,测试字符串中缺少TestApp,未处理异常,大括号是una已对齐,当然是真正的关键-更正这些问题后,代码将按预期工作。@如果这没有帮助,请编辑问题中的代码,或者从编辑器中复制一段编译后的无错误代码,并使用源代码粘贴到此处formatting@Asif请停止粘贴代码作为对此答案的注释编辑您的问题并添加代码片段,就像我在前面的两条评论中所做的那样(很抱歉大喊大叫,但mtraut在20分钟前已经说过这一点)
class JarUtils {
public static List getClasseNamesInJAR(String jarName) throws Exception {
ArrayList classes = new ArrayList();
try {
JarInputStream jarFile = new JarInputStream(new FileInputStream(jarName));
JarEntry jarEntry;
while (true) {
jarEntry = jarFile.getNextJarEntry();
if (jarEntry == null)
break;
if (jarEntry.isDirectory())
continue;
if ((jarEntry.getName().endsWith(".class"))) {
classes.add(jarEntry.getName().replaceAll("/", "\\."));
}
}
return classes;
} catch (Exception e) {
throw e;
}
}
}
public class ClassImplementer {
private List getClasses(String path, String interfaceName) throws Exception {
List list = new ArrayList();
if (path.endsWith(".jar")) {
List l = JarUtils.getClasseNamesInJAR(path);
if(l!=null && l.size()<=0)
return null;
try {
URL urls[] = {};
JarFileLoader cl = new JarFileLoader(urls);
cl.addFile(path);
Class interFace = Class.forName(interfaceName);
for (int i = 0; i < l.size(); i++) {
String[] tempClass = l.get(i).toString().split(".class");
Class clas = cl.loadClass(tempClass[0]);
boolean match = !clas.isInterface() && !clas.isEnum() && interFace.isAssignableFrom(clas) ;
if(match ) {
list.add(tempClass[0]);
}
}
return list;
}
catch (Exception ex) {
throw ex;
}
return list;
}
}
public class Test{
public static void main(String[] args)
ClassImplementer imp=new ClassImplementer();
try{
List l=imp.getClasses("c:/abc.jar","java.io.Serializable");
for(int i=0;i<l.size();i++)System.out.println(l.get(i)+" implements java.io.Serializable");
}catch(Exception ex){}
}
Testimplements java.io.Serializable
for(int i=0;i<l.size();i++){
String[] t=l.get(i).toString().split(".class");
Class clas=cl.loadClass(t[0]);
// ^^^^
boolean m=!clas.isInterface()&&!clas.isEnum()&&iFace.isAssignableFrom(clas);
if(m)
list.add(t[0]);
// ^^^^
}