2012-03-27 6 views
7

Şimdi oldukça uzun bir süredir bunu yapmaya çalışıyorum ve istenen çıktıyı elde edemiyorum.java SuperInterfaces Başlarken

  • doğrudan uygulanan arabirimler java.util.Vector eğer: Yapmak istediğim ne

    bir sınıf adı almak java.util.Vector

    söylemek zorunda olduğunu. Üst sınıflar tarafından doğrudan uygulanan arabirimler

  • .
  • ve bu arayüzlerin tüm süper arayüzleri ile, geçici olarak.

Herhangi bir yardım için teşekkür ederiz.

+0

java.lang.Class yöntemleri mi arıyorsunuz? getInterfaces? – Glenn

+0

Evet kullanıyorum getInterfaces(); Bunun için yinelemeyi kullanır mıyım yoksa başka bir yolu var mı? – programmingnewb

+0

Özyinelemeyi kullanırım. Http://www.java2s.com/Tutorial/Java/0125__Reflection/GetSuperInterfaces.htm adresinde birkaç örnek bulunmaktadır. – Glenn

cevap

0

java.util.Vector bir arabirim olmamasına ve dolayısıyla bir arabirim ile genişletemese de, bu tür özellikleri sağlamak için Reflections gibi bir kitaplık kullanmanız yeterlidir. Reflections, sınıf yolunu ve sorguyu verilen sınıfı/arabirimi uygulayan veya genişleten bir dizi koşul için taramanızı sağlar. Arabirim uygulamalarını ve notlandırılmış sınıfları taramam gereken birkaç projede başarılı bir şekilde kullandım.

İşte açık link: http://code.google.com/p/reflections/

Ayrıca, sadece bir sınıf/uzanır sadece sınıf özelliğiyle sınıf yansıma api kullanabilirsiniz uygulayan hangi sınıf/arabirim öğrenmek isteyen varsa.

İşte bazı örnekler verilmiştir:

//get all public methods of Vector 
Vector.class.getMethods(); 
//get all methods of the superclass (AbstractList) of Vector 
Vector.class.getSuperclass().getMethods(); 
//get all interfaces implemented by Vector 
Vector.class.getInterfaces(); 
3

Sen reflection bunun için kullanan bir BFS yapabilirdi. Sadece Vector içerir ve iteratif Class.getInterfaces() ve Class.getSuperclass()

[BFS çalışması için gereklidir] Queue sadece eklenen öğeler ekleyin kullanarak yeni unsurlarla seti artırmak bir Set<Class<?>> ile

Başlat. Sıra boş olduğunda sonlandırın.

Mesaj işleme: Set yineleme - Böyle bir şey görünmelidir Class.isInterface()

kullanarak arayüzleri sadece nesneleri ve atın: Başka bir kütüphane kullanımı açıksa

Class<?> cl = Vector.class; 
Queue<Class<?>> queue = new LinkedList<Class<?>>(); 
Set<Class<?>> types =new HashSet<Class<?>>(); 
queue.add(cl); 
types.add(cl); 
    //BFS: 
while (queue.isEmpty() == false) { 
    Class<?> curr = queue.poll(); 
    Class<?>[] supers = curr.getInterfaces(); 
    for (Class<?> next : supers) { 
     if (next != null && types.contains(next) == false) { 
      types.add(next); 
      queue.add(next); 
     } 
    } 
    Class<?> next = curr.getSuperclass(); 
    if (next != null && types.contains(next) == false) { 
     queue.add(next); 
     types.add(next); 
    } 
} 
    //post processing: 
for (Class<?> curr : types) { 
    if (curr.isInterface()) System.out.println(curr); 
}