2015-06-12 17 views
5

Javassist ile "com.stackoverflow. *" Gibi bir kalıp kullanarak tüm sınıfları nasıl alabilirim?Tüm sınıfları Javascript kullanarak bir desen kullanarak alma

ben sadece 2 yöntemlerini bulundu:

1/tam adıyla bir sınıf bul

CtClass ClassPool.getDefault().getCtClass("com.stackoverflow.user.name") 

2/fullnames ile sınıflarının listesini bulun:

CtClass[] ClassPool.getDefault().get(String [] arg0) 

cevap

3

Bazı kullanabilirsiniz gibi kütüphane: https://github.com/ronmamo/reflections

Zayıflamıyorum k bunu sadece JRE sınıfları ile yapabilirsiniz. dokümandan

Örnek:

Reflections reflections = new Reflections("my.project.prefix"); 

Set<Class<? extends SomeType>> subTypes = 
      reflections.getSubTypesOf(SomeType.class); 

Set<Class<?>> annotated = 
      reflections.getTypesAnnotatedWith(SomeAnnotation.class); 
+1

Teşekkürler ama eğer mümkünse javasist kütüphanesi ile yapmak istiyorum – user1335838

3

Michael Laffargue 'ın öneri gitmek için en iyi yoldur. Reflections kitaplığı, kapakların altında javassist kullanır. Temel olarak, javassist, sınıf veya jar dosyalarından ham bayt kodunun okunması ve sınıf meta-verilerinin gerçekten sınıf yüklemesi olmaksızın çıkarılması anlamına gelir. Yansımalar, konumlandırma konusunda daha zengin bir API sağlar (sınıf yolu belirtimleri aracılığıyla) ve kümeyi filtreleyerek Aradığınız sınıflar.

Aynı şeyi yalnızca javassist kullanarak yapabilirsiniz, ancak Yansımalar kitaplığının bir kısmını yeniden oluşturacaksınız. Nasıl çalıştığını görmek için Yansımalar kaynak koduna bakabilir, ama çok genel olarak konuşursak, bu şuna benzer:

  1. taramak istediğiniz sınıf yolunu bulun. Bu genellikle bir sınıf dosyaları ağacıyla veya bir grup Jar dosyasıyla birlikte bir grup dizin olabilir, ancak WARs veya EARs gibi daha karmaşık yapıları da içerebilir (yansımaları oldukça güzel destekler).

  2. Sınıf dosyalarının bulunduğu dosya sisteminin kökünü veya ClassPool örneğinize JAR dosya referansını ekleyin.

  3. Dosya sistemi yineleme veya JarInputStream kullanarak, her sınıf dosyası veya JarEntry arasında yineleyin. "Com/stackoverflow/**. Class" ile eşleşmeyen tüm dosyaları veya girdileri filtreleyebilirsiniz.
  4. Kalanlar için, dosyanın adını veya girdisini kullanarak sınıf adını derleyin ve javassist sınıf havuzundan yükleyin. .
  5. Başka arama ölçütlerini uygulamak için yüklü CtClass'ı kullanın.
  6. Artık sınıf referans listeniz var, çöp toplama için ClassPool'u bırakın.
İlgili konular