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