Affichage des articles dont le libellé est utilitaire. Afficher tous les articles
Affichage des articles dont le libellé est utilitaire. Afficher tous les articles

vendredi 19 novembre 2010

Découvrir et lancer les classes d'un jar ayant une méthode "main"

Introduction

Encore une utilité de l’introspection : afficher les classes disposant d'une méthode "main" dans un jaret offrir la possibilité de la lancer. C'est bien pratique quand on ne veut pas lancer la main-class du manifest.

Méthode

  • Référencer le jar dans un classLoader
  • Parcourir les entrées du jar pour ne prendre que les classes ayant une méthode publique, statique dénommée "main"
  • Les afficher par exemple dans un ordre chronologique

Extrait de code concernant l’extraction

File f = new File(location);
loader = new URLClassLoader(new URL[] { f.toURI().toURL()  } );
JarFile jf = new JarFile(location);
Enumeration e = jf.entries();
JarEntry je = null;
for( int j=0 ; e.hasMoreElements() ; j++ )
      {
      je = (JarEntry)e.nextElement();
//---------------------------------------------
public static boolean hasPublicStaticVoidMainMethod ( Class _c )
{
      Method [] publicMethods = _c.getMethods() ;
      for ( Method uneMethode : publicMethods )
      {
            int m = uneMethode.getModifiers() ;
            if ( ( Modifier.isPublic(m) ) && ( Modifier.isStatic(m) ) && ( uneMethode.getReturnType().toString().compareTo("void") == 0 ) && ( uneMethode.getName().compareTo("main") == 0 ) )
            {
                  return true ;
            }
      }
      return false ;
}
//---------------------------------------------

Extrait de code concernant l'invocation de la méthode

Class c = Class.forName(s);
Class[] argTypes = new Class[] { String[].class };
Method main = c.getDeclaredMethod("main", argTypes);
String[] mainArgs = {} ;
main.invoke(null, (Object)mainArgs);

Copies d’écrans correspondantes


Exemple concernant rt.jar