Introducción
En nuestro quehacer diario en Autentia, nos encontramos en multitud de ocasiones con problemas de carga de clases en Java. Estos problemas suelen dar lugar a excepciones de tipo ClassNotFoundException, NoSuchMethodError, etc., y son bastante difíciles de diagnosticar (sobre todo en entornos JEE donde se suele usar una jerarquía de ClassLoaders compleja).
Para estos casos, os proponemos el uso de la siguiente página JSP (compatible con JRE1.4) en la que se vuelca toda la información disponible mediante reflexión sobre la clase que se pida. Consiste en un formulario donde se debe escribir el nombre completo cualificado de la clase. Al pulsar el botón, el servidor nos devolverá una información exhaustiva de la clase: en que JAR se encuentra, su ClassLoader, interfaces que implementa, clases internas, campos, constructores y métodos.
Hale ¡A disfrutarlo¡
Código fuente
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@page import="java.lang.reflect.*" %> <%@page import="java.net.*" %> <%@page import="java.io.*" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%! public String getPathToClassOrJar( Class clazz ) { String cn = "/" + clazz.getName(); cn = cn.replace('.', '/'); cn += ".class"; URL url = clazz.getResource(cn); String path = url.getPath(); return path; } public void putInfo( JspWriter out, String key, String value ) throws IOException { out.println("<tr><td style='border-bottom: 1px solid #707070' nowrap><b>"+key+"</b></td><td style='border-bottom: 1px solid #707070'>"+value+"</td></tr>"); } %> <% String cmd = request.getParameter("cmd"); String className = request.getParameter("class"); if( cmd==null ) cmd = ""; if( className==null ) className = ""; %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Class Info</title> </head> <body> <h1>Class Info</h1> <form method="post"> Type the fully qualified name of a class (example: java.lang.String) for which you want to get info:<br/> <input type="text" name="class" value="<%=className%>" size="128"/><br/><br/> <input type="submit" name="cmd" value="Get class info"/><br/> </form> <% if( !cmd.equals("") ) { out.println( "<h1>Information for class <i>"+className+"</i>:</h1>" ); out.println( "<table>" ); try { Class clazz = Class.forName(className); String location = getPathToClassOrJar(clazz); putInfo( out, "Class location:", location ); ClassLoader loader = clazz.getClassLoader(); if( loader == null ){ putInfo( out, "Class loader:", ClassLoader.getSystemClassLoader().toString() ); } else { putInfo( out, "Class loader:", loader.toString() ); } Class[] ifaces = clazz.getInterfaces(); for( Class iface : ifaces ) { putInfo( out, "Implemented interface:", iface.getName() ); } Class[] inners = clazz.getDeclaredClasses(); for( Class inner : inners ) { putInfo( out, "Inner class:", inner.getName() ); } Field[] fields = clazz.getDeclaredFields(); for( Field field : fields ) { putInfo( out, "Field:", field.toString() ); } Constructor[] ctors = clazz.getConstructors(); for( Constructor ctor : ctors ) { putInfo( out, "Constructor:", ctor.toString() ); } Method[] methods = clazz.getDeclaredMethods(); for( Method method : methods ) { putInfo( out, "Method:", method.toString() ); } } catch( ClassNotFoundException e ) { putInfo( out, "Class not found.", "" ); } catch( Throwable e ) { putInfo( out, "Error analyzing class:", e.toString() ); } out.println( "</table>" ); } %> </body> </html>
[…] o problemas sobre las dependencias a importar para una clase en concreto, no dejéis de visitar el tutorial de Iván Zaera sobre Obtención de información de clases Java en aplicaciones web. En él, nos propone una […]