Estigmatizados

La informática profesional no es un juego de políticos

JSP para localizar el archivo JAR que contiene una clase Java

Estoy intentando desplegar un portlet JSF, desarrollado con Netbeans Portal Pack 3.0.x Como podéis observar por la conjugación del verbo intentar, no he tenido éxito todavía.

La primera prueba, con un portlet básico JSR-286, fue de maravilla. Dos clicks de ratón un deploy y ya tenía el portlet en Liferay. Los problemas vienen con el portlet visual JSF.

Comentaré en breve algunos de los problemas que he ido resolviendo a trancas y a barrancas. Ahora lo dejo en que tengo problemas de dependencias JAR en la aplicación web del portlet. Para ir resolviéndolas he creado una cutre JSP para intentar localizar las clases en el entorno de las aplicaciones web. Copiando la JSP en un contexto nos puede dar una idea aproximada de qué ClassLoader ha cargado la clase y de qué archivo Jar.

Un ejemplo de uso: http://localhost:8080/test.jsp?classname=com.liferay.portlet.PortletFilterFactory

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
   
<%
        if (request.getParameter("classname") == null) {
            out.println("Introduce el nombre de clase.");
        } else {
			String className = request.getParameter("classname");
			String normClassName = className.replace(".", "/").concat(".class");
			java.net.URL url = this.getClass().getClassLoader().getResource(normClassName);

			if (url != null)
				out.println("<b>"+url.getFile()+"</b>");
			else
				out.println("Lo siento <b>no encontrado</b>");
        }
    %>

septiembre 8, 2009 Posted by | Portales | , , , | Deja un comentario

Resultados de: ¿Cuánto sabemos de Java?

Cerramos la encuesta para valorar cuánto sabemos de Java, agradeciendo al “Sr. Francisco Ros” su atinada respuesta que una vez más nos demuestra por qué está donde está 🙂

encuesta-01

Resultados

La opción mayoritariamente escogida es la de que Java pasa los tipos básicos por valor y el resto por referencia. Esto viene a demostrar -junto con ¿Quién quiere ser millonario?- que no siempre la opción más popular es la más correcta.

La solución es:

Java sólo permite el paso de parámetros por valor

Más información en: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html

A diferencia de C/C++ no podemos indicar a otro método la dirección de una variable local para que este segundo método pueda modificar su contenido. El paso es siempre por valor; es decir: en la llamada se crean copias de las variables argumento y se copian sus valores.

En Java las variables pueden clasificarse según el tipo sobre el que se definen:

  • Tipos primitivos: int, char, long, …
  • Tipos referencia: Array, referencias a objetos (String), …

Lo anterior ¿quiere decir que cuando pasamos un objeto se copia todo el contenido del objeto? La respuesta es no, dado que los objetos nunca se pasan como argumentos; lo único que se pasa es la referencia al objeto. Esta referencia podemos verla como un smart pointer de C++, como una variable que simplemente guarda la dirección del objeto. Cuando en Java se pasa una referencia a objeto se crean copias de la variable referencia y se copia su valor: la dirección de memoria donde está el objeto.

Resumiendo:

El paso de parámetros en Java se realiza por valor, lo único que para objetos se pasan variables referencia por valor.

Experimento

Los excépticos pueden comprobar que la afirmación anterior es cierta probando el siguiente ejemplo:

public class TestArgPass {

	private static void concat(String origStr, String concatStr) {
		origStr = origStr + concatStr;
	}	

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String origStr = "Hola ";
		String concatStr = "Mundo";

		concat(origStr, concatStr);

		System.out.println(origStr);
	}
}

Si el paso fuese por referencia origStr debería apuntar a un nuevo String formado por la concatenación de los literales “Hola ” y “Mundo”; en caso contrario origStr permanecería con el mismo valor que tenía antes de la llamada; es decir: apuntando a un objeto String con valor “Hola “.

agosto 21, 2009 Posted by | Programación | , , | Deja un comentario