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);