Categorías
Java Development Tools (JDT)

Atravesar el archivo .jar mediante Eclipse JDT

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 ICompilaciónUnidad. Aquí deberíamos usar IClassFile en lugar de. El siguiente método muestra cómo hacer un bucle de cada paquete (es decir, IPackageFragment).

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());
								}
							}
						}
					}
 
				}
			}
 
		}
 
	}
}
  Representar un archivo Java como AST (árbol de sintaxis abstracta)

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.

—- classFile: Object.class
——– 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

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *