2013-10-25 16 views
8

Şu anda ClassLoader numaralı telefondan classes alanındaki tüm yüklü dersleri almak ve ardından getPackage'un aradığım pakete eşit olup olmadığını kontrol etmek için yansıma kullanıyorum. Bu sorunla karşılaştığım bir problem ClassLoader tarafından yüklenemediğim ama Class.forName kullanarak kendimi yükleyemediğimden, çünkü dinamik olarak yüklendikleri ve sürekli değiştikleri için sınıfların ismini bilmeyeceğim. . Sınıfların hepsinin ortak bir yönü, Module'u uzatmalarıdır. Tüm sınıfları bir paketten yüklemeye nasıl başlarım?Her sınıfı bir pakette yükleme

Şimdiden teşekkürler.

+0

http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection bunu cevaplıyor görünüyor – iluxa

+0

@iluxa Paketteki bütün dersleri alabilirim ancak sadece –

+1

yüklenirse açıklanmıştır [burada] (http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection/520344#520344) – mithrandir

cevap

0

reflections API'u kullanarak kesinlikle çalışır. Eğer yapmazsan yanlış yola koymuş olabilirsin. Bu örneği hazırladım ve paket içindeki tüm sınıfları herhangi bir sınıf yükleyiciden bağımsız olarak yazdırıyor.

package com.test; 

import java.util.Arrays; 
import java.util.Iterator; 
import java.util.Set; 

import org.reflections.Reflections; 
import org.reflections.scanners.FieldAnnotationsScanner; 
import org.reflections.scanners.MemberUsageScanner; 
import org.reflections.scanners.MethodAnnotationsScanner; 
import org.reflections.scanners.MethodParameterNamesScanner; 
import org.reflections.scanners.MethodParameterScanner; 
import org.reflections.scanners.SubTypesScanner; 
import org.reflections.scanners.TypeAnnotationsScanner; 
import org.reflections.util.ClasspathHelper; 
import org.reflections.util.ConfigurationBuilder; 
import org.reflections.util.FilterBuilder; 

public class Runner { 

    public static void main(String[] args) { 
     Reflections reflections = new Reflections(); 
     FilterBuilder TestModelFilter = new FilterBuilder().include("com.test.*"); 

     reflections = new Reflections(new ConfigurationBuilder() 
       .setUrls(Arrays.asList(ClasspathHelper.forClass(Runner.class))).filterInputsBy(TestModelFilter) 
       .setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner(), new FieldAnnotationsScanner(), 
         new MethodAnnotationsScanner(), new MethodParameterScanner(), new MethodParameterNamesScanner(), 
         new MemberUsageScanner())); 

     Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class); 
     System.out.println(allClasses); 
     for (Iterator it = allClasses.iterator(); it.hasNext();) { 
      Class<? extends Object> clazz = (Class<? extends Object>) it.next(); 
      System.out.println(clazz.getCanonicalName()); 
     } 
    } 

} 

Tüm içe aktarma amaçlarına ekledim, böylece hangi API'yi kullandığını görebilirsiniz. Bu senin için uygun mu?