2013-04-18 2 views
0

Я использую Spring Framework для динамического поиска класса и его методов и аргументов.Java Reflection - Как исключить интерфейс при динамическом загрузке класса

это методы, которые я использую:

public List<Class> findMyTypes(String basePackage) throws IOException, ClassNotFoundException 
    { 
     ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); 
     MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resourcePatternResolver); 

     List<Class> candidates = new ArrayList<Class>(); 
     String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + 
            resolveBasePackage(basePackage) + "/" + "**/*.class"; 
     Resource[] resources = resourcePatternResolver.getResources(packageSearchPath); 
     for (Resource resource : resources) { 
      if (resource.isReadable()) { 
       MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); 
       if (isCandidate(metadataReader)) { 
        candidates.add(Class.forName(metadataReader.getClassMetadata().getClassName())); 
       } 
      } 
     } 
     return candidates; 
    } 
    public String resolveBasePackage(String basePackage) { 
     return ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage)); 
    } 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public boolean isCandidate(MetadataReader metadataReader) throws ClassNotFoundException 
    { 
     try { 
      Class c = Class.forName(metadataReader.getClassMetadata().getClassName()); 
      if (c.getAnnotation(Controller.class) != null) { 
       return true; 
      } 
     } 
     catch(Throwable e){ 
     } 
     return false; 
    } 

я загрузить класс, который получил аннотацию @Controller. Он работает нормально, но я хочу загрузить только класс not interface, также как получить методы и аргументы загруженного класса.

EDIT:

Это, как я получить все имена классов и попытаться получить имя метода:

List classNames = hexgenClassUtils.findMyTypes("com.hexgen.*"); 
      Iterator<Class> it = classNames.iterator(); 
      while(it.hasNext()) 
      { 
       Class obj = it.next(); 
       System.out.println("Class :"+obj.toString()); 

       cls = Class.forName(obj.toString()); 
       Method[] method = cls.getMethods(); 
       for (Method method2 : method) { 
        System.out.println("Method name : "+method2.toGenericString()); 
       } 
       // TODO something with obj 
      } 

Проблема я лицо class com.hexgen.api.facade.HexgenWebAPI здесь класс приходит из-за которого я не способный динамически загрузить класс и получить следующее исключение.

java.lang.ClassNotFoundException: class com.hexgen.api.facade.HexgenWebAPI так как его решить.

Просьба помочь мне найти решение.

С наилучшими пожеланиями

ответ

2

попробовать

 Class c = Class.forName(metadataReader.getClassMetadata().getClassName()); 
     if (!c.isInterface() && c.getAnnotation(Controller.class) != null) { 
      return true; 
     } 
+0

Great :). Это помогло мне. По какой-то причине я не могу принять ответ. Сделаю это через три минуты. Сейчас я сталкиваюсь с одной проблемой. обновит вопрос, пожалуйста, помогите мне решить его. –

+0

Используйте obj.getName() здесь Class.forName (obj.toString()); –

+0

:) решил. большое спасибо. теперь я могу получить имя класса и методов, как получить аргументы для методов. метод может принимать один или несколько аргументов? –

Смежные вопросы