How to discovering types exported by OSGi bundle without installing/activating?

前端 未结 2 1230
执笔经年
执笔经年 2020-12-19 20:26

Basically i want to discover if a jar implements any number of interfaces wihtout activating or starting the bundle. Is it possible to read the meta data from the meta-inf f

2条回答
  •  一生所求
    2020-12-19 20:42

    you may try something like below. Find the ".class" files in the exported packages using bundle.findResource(...) method.

     BundleContext context = bundle.getBundleContext();
      ServiceReference ref = context.getServiceReference(PackageAdmin.class.getName());
      PackageAdmin packageAdmin = (PackageAdmin)context.getService(ref);
      List agentClasses = new ArrayList();
      ExportedPackage[] exportedPackages = packageAdmin.getExportedPackages(bundle);
      for(ExportedPackage ePackage : exportedPackages){
          String packageName = ePackage.getName();
          String packagePath = "/"+packageName.replace('.', '/');
          //find all the class files in current exported package
          Enumeration clazzes = bundle.findEntries(packagePath, "*.class", false);
          while(clazzes.hasMoreElements()){
           URL url = (URL)clazzes.nextElement();
           String path = url.getPath();
           int index = path.lastIndexOf("/");
           int endIndex = path.length()-6;//Strip ".class" substring
           String className = path.substring(index+1, endIndex);
           String fullClassName=packageName+"."+className;
           try {
         Class clazz = bundle.loadClass(fullClassName);
         //check whether the class is annotated with Agent tag.
         if(clazz.isAnnotationPresent(Agent.class))
          agentClasses.add(clazz);
        } catch (ClassNotFoundException e) { 
         e.printStackTrace();
        }
          }
      }
    

提交回复
热议问题