2009-12-29 63 views
0

說我有字符串「Bar」,我想知道Bar是否是有效的對象,此外,無論「Bar」是否擴展「Foo」。我會使用Java反射還是有更好的方式,比如數據庫?我該怎麼做?從外部檢查Java對象層次

乾杯

+0

你有一個完整的包名? – 2009-12-29 06:36:15

+0

我在想什麼,有人告訴我「程序allnighter需要一個bar並且什麼都不會返回,allnighter確實......用屬性a,b,c的Foo調用allnighter。我的程序應該生成這個代碼。它大部分都是這樣做的,但並不總是處理好繼承。 – 2009-12-29 06:57:39

回答

1

如果你不知道包 - 只有類的名字,你可以試試這個,使用Spring框架:

List<Class> classes = new LinkedList<Class>(); 
PathMatchingResourcePatternResolver scanner = new 
    PathMatchingResourcePatternResolver(); 
// this should match the package and the class name. for example "*.Bar" 
Resource[] resources = scanner.getResources(matchPattern); 

for (Resource resource : resources) { 
    Class<?> clazz = getClassFromFileSystemResource(resource); 
    classes.add(clazz); 
} 


public static Class getClassFromFileSystemResource(Resource resource) throws Exception { 
    String resourceUri = resource.getURI().toString(); 
    // finding the fully qualified name of the class 
    String classpathToResource = resourceUri.substring(resourceUri 
      .indexOf("com"), resourceUri.indexOf(".class")); 
    classpathToResource = classpathToResource.replace("/", "."); 
    return Class.forName(classpathToResource); 
} 

兩種以上的方法給你的類列表名爲「酒吧」(他們可能不止一個!)。

然後它更容易

expectedSuperclass.isAssignableFrom(yourClass); 
1

是的,反映的是答案:

Class barClass = Class.forName("some.package.Bar"); // will throw a ClassNotFoundException if Bar is not a valid class name 
Class fooClass = some.package.Foo.class; 
assert fooClass.isAssignableFrom(barClass); // true means Bar extends (or implements) Foo