2009-12-29 3 views
0

Скажите, что у меня есть строка «Bar», и я хочу знать, является ли Bar допустимым объектом, и, кроме того, «Bar» расширяет «Foo». Будет ли я использовать отражение Java или есть лучший способ, как база данных? и как мне это сделать?Проверьте иерархию объектов Java Внешне

Приветствия

+0

У вас есть полное имя пакета? –

+0

То, что я думаю, это то, что кто-то говорит мне: «процедура allnighter берет бар и ничего не возвращает. Allnighter делает ... .Зазывайте allnighter с помощью Foo с атрибутами a, b, c." и моя программа должна генерировать этот код. Это делается по большей части, но не всегда хорошо справляется с наследованием. –

ответ

1

В случае, если вы не знаете, пакет - только имя класса, вы могли бы попробовать это, используя рамки пружинного:

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 
Смежные вопросы