2016-06-18 4 views
0

Ich habe zwei OSGI-Bundles A und B. Alle Pakete von Bundle A sind privat. In Bündel B verwendete ich den Code aus https://stackoverflow.com/a/22800118/5057736:Erhalten Bundle-Klassen von privaten Paketen in einem anderen Bundle

BundleA

class ClassA extends ClassB{ 
    ClassA(){ 
     super(ClassA.class); 
    } 
} 

Bundle B

class ClassB{ 
... 
public void doFoo(){ 
{ 
Bundle bundle = FrameworkUtil.getBundle(ClassAReference); 
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class); 
// Getting all the class files (also from imported packages) 
Collection<String> resources = bundleWiring.listResources("/", "*.class", BundleWiring.LISTRESOURCES_RECURSE); 

List<String> classNamesOfCurrentBundle = new ArrayList<String>(); 
for (String resource : resources) { 
    URL localResource = bundle.getEntry(resource); 
    // Bundle.getEntry() returns null if the resource is not located in the specific bundle 
    if (localResource != null) { 
     String className = resource.replaceAll("/", "."); 
     classNamesOfCurrentBundle.add(className); 
    } 
} 

Allerdings bekomme ich Ressourcen - alle Klassen, die ein Klassenladeprogramm geladen bündeln. Aber ich brauche nur die Klassen, die im Bündel A sind. Ich meine, ich brauche Klassen, die zu Bündel A gehören. Um sie zu bekommen, wie ich verstehe, brauche ich localResource. LocalResource ist jedoch immer null, aber die Klassen befinden sich genau in Paket A - beispielsweise ClassA. Wie bekomme ich Klassen, die zu Bundle A in ClassB gehören?

Antwort

1

Statt

Collection<String> resources = bundleWiring.listResources("/", "*.class", BundleWiring.LISTRESOURCES_RECURSE); 

Verwendung

List<URL> resources = bundleWiring.findEntries("/", "*.class", BundleWiring.FINDENTRIES_RECURSE); 

Die zweite Funktion für Ressourcen in einem bestimmten Bündel nur schaut und in seinem Fragment Bündel. Siehe die Javadoc: https://osgi.org/javadoc/r4v43/core/org/osgi/framework/wiring/BundleWiring.html#findEntries(java.lang.String,%20java.lang.String,%20int)

+1

Ich denke, eine wichtigere Frage ist: Was um Himmels Willen ist @ JimJim2000 eigentlich zu tun? –

+0

Wahrscheinlich einige Bytecode-Manipulation, Weben und AOP. All die Dinge, die man in OSGi vermeiden sollte. –

+0

Nun ... andere Fragen deuten darauf hin, dass er noch nicht von Diensten gehört hat. Aus dieser Frage klingt es, als ob er Reflektionen verwendet, um direkt auf Klassen innerhalb anderer Bündel zuzugreifen. Ich schaudere, um nachzudenken. –

Verwandte Themen