Este ejemplo de código pertenece a la serie de tutoriales Eclipse JDT.
Si desea obtener todos los nombres de clases, métodos y campos de un archivo jar de Java, puede usar el código siguiente para obtenerlos.
Este ejemplo de código es para obtener información (por ejemplo, campo en una clase, nombre de método, tipo de retorno de método, etc.) de archivos Jar. No hay duda de que podemos usar eclipse JDT para analizar el código fuente de jave, pero también podemos usarlo para recorrer archivos .class precompilados dentro de cualquier archivo jar.
El siguiente código solo funciona en un proyecto de complemento de eclipse, si no sabe cómo hacer un eclipse, vaya a «Cómo crear un proyecto de complemento simple».
Para analizar el código fuente, usamos
private void processRootDirectoryJar() throws JavaModelException,CoreException { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); System.out.println("root" + root.getLocation().toOSString()); IProject[] projects = root.getProjects(); // process each project for (IProject project : projects) { System.out.println("project name: " + project.getName()); if (project.isNatureEnabled("org.eclipse.jdt.core.javanature")) { IJavaProject javaProject = JavaCore.create(project); IPackageFragment[] packages = javaProject.getPackageFragments(); // process each package for (IPackageFragment aPackage : packages) { // We will only look at the package from the source folder // K_BINARY would include also included JARS, e.g. rt.jar // only process the JAR files if (aPackage.getKind() == IPackageFragmentRoot.K_BINARY && aPackage.getElementName().equals("java.lang")) { System.out.println("inside of java.lang package"); for (IClassFile classFile : aPackage.getClassFiles()) { System.out.println("----classFile: " + classFile.getElementName()); // A class file has a single child of type IType. // Class file elements need to be opened before they // can be navigated. If a class file cannot be // parsed, its structure remains unknown. // Use IJavaElement.isStructureKnown to determine // whether this is the case. // System.out.println(); // classFile.open(null); for (IJavaElement javaElement : classFile .getChildren()) { if (javaElement instanceof IType) { System.out.println("--------IType " + javaElement.getElementName()); // IInitializer IInitializer[] inits = ((IType) javaElement) .getInitializers(); for (IInitializer init : inits) { System.out .println("----------------initializer: " + init.getElementName()); } // IField IField[] fields = ((IType) javaElement) .getFields(); for (IField field : fields) { System.out .println("----------------field: " + field.getElementName()); } // IMethod IMethod[] methods = ((IType) javaElement) .getMethods(); for (IMethod method : methods) { System.out .println("----------------method: " + method.getElementName()); System.out .println("----------------method return type - " + method.getReturnType()); } } } } } } } } } |
La salida contendrá algo como lo siguiente. Observe que el tipo de declaración tiene letras mayúsculas, como V, L, Z, I. En caso de que le interesen esas letras mayúsculas, vaya a la referencia 1 para ver qué representan.
——– Objeto de tipo
—————- método: Objeto
—————- tipo de retorno del método – V
—————- método: registerNatives
—————- tipo de retorno del método – V
—————- método: getClass
—————- tipo de retorno del método – Ljava.lang.Class <*>;
—————- método: hashCode
—————- tipo de retorno del método – I
—————- método: igual
—————- tipo de retorno del método – Z
—————- método: clonar
—————- tipo de retorno del método – Ljava.lang.Object;
—————- método: toString
—————- tipo de retorno del método – Ljava.lang.String;
—————- método: notificar
—————- tipo de retorno del método – V
—————- método: notificar a todos
—————- tipo de retorno del método – V
—————- método: espera
—————- tipo de retorno del método – V
—————- método: espera
—————- tipo de retorno del método – V
—————- método: espera
—————- tipo de retorno del método – V
—————- método: finalizar
—————- tipo de retorno del método – V
—————-método:
—————- tipo de retorno del método – V
Además, no hay duda de que puede encontrar información similar y más del código fuente analizando cada archivo.
Referencia:
1. http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Fguide%2Fjdt_int.htm