Keep in touch

RSS Feed Twitter Facebook Delicious

Subscribe via Email

Evitar la seleccion de texto con JQuery

August 22nd, 2011 by pako received 1 Comment »

Hoy estuve investigando como evitar la selección de texto en JavaScript o ver si ya existía algo en jQuery, primero en JS me encontré esta solución pero no me gusto porque en si lo que se hace es cancelar el evento onselectstart y onmousedown y con ello evitar que la selección inicie

Después busque si había algo utilizando jQuery pero solo me encontré esta forma un poco más elegante que la anterior, que consiste en modificar la propiedad unselectable y los css MozUserSelect y KhtmlUserSelect. pero la forma en que lo aplica el autor no me agrado mucho.. así que me decidí a crear este mini plugin para hacerlo reutilizable y más elegante

/*
* selectTextOff; plugin para evitar la selección en los elementos seleccionados por jQuery
* 22/08/2011
* JFcoDíaz (http://www.devtics.com.mx)
* MIT/GNU
*/
(function($){
  $.fn.extend({
    selectOff : function(){
     this.attr('unselectable', 'on').css({
        'KhtmlUserSelect' : 'none',
        'MozUserSelect' : 'none'
      }).each(function(i,o){
        o["onselectstart"] = o['onmousedown'] = function(){return false;}
      });
    }
  });
})(jQuery);

ahora bastaría con llamar selectOff

$("#unDiv").selectOff();

Dejando todo seleccionable a excepción del “#unDiv”… o bien Toda la web:

$("body").selectOff();

Ya que el plugin es muy pequeño no dejo un .js, solo copia y pega en uno de tus .js que uses en tu web (recuerda incluir los comentarios)

Reflexión en Java IV, ejecución de un método si...

February 1st, 2011 by pako received No Comments »

Después de un buen rato de no seguir con los post de reflexión por varios motivos, pero movido por la inquietud de @Carlos La Serna, he decido retomar los post =),

Bueno en esta ocasión trataré de mostrar como se pueden ejecutar los métodos de una clase que no reciban parámetros, por lo pronto sera una clase que conozcamos para no complicar tanto el ejercicio aunque como ya demostré en los post anteriores podríamos no conocerla y manejar reflexión para conocerla pero esto lo dejare para posts posteriores.

para ver como ejecutar los métodos me he creado estas clases que simulan una consola de comandos, primero una versión del cmd, que no utiliza reflexión
excecv1.java

package reflexion;
import java.util.Scanner;
/**
 *
 * @author fcodiaz
 *
 */
public class execv1 {
   public static void main(String a[]){
      Scanner sc = new Scanner(System.in);
      Cmd cmd=new Cmd();
      String coman="";
      while(true){
         coman=sc.nextLine();
         if(coman.equals("help")){
            cmd.help();
         }else if(coman.equals("about")){
            cmd.about();
         }else if(coman.equals("exit")){
            cmd.exit();
         }else if(coman.equals("hello")){
            cmd.hello();
         }else{
            System.out.println("el comando " + coman + " no existe ");
         }
      }
   }
}

y aquí la clase que contiene los comandos
cmd.java

package reflexion;
/**
 *
 * @author fcodiaz
 */
public class Cmd {

   public Cmd() {
      System.out.println("ejecuta el comando help para obtener ayuda!");
   }
   public void help(){
      System.out.println("Quieres ayuda =)n"
              + "Lista de Comandos:n"
              + " - hello  : muestra un saludon"
              + " - exit   : cierra el CMDn"
              + " - about  : info de quién hizo esta cosa!");
   }
   public void exit(){
      System.out.println("Bye!!");
      System.exit(0);
   }
   public void hello(){
      System.out.println("Hola Mundo!!!");
   }
   public void about(){
      System.out.println("By FcoDíaznwww.devtics.com.mx");
   }
}

como verán para esta versión necesitamos conocer la clase cmd en el momento de codificar. para hacerlo con reflexion necesitamos obtener el objeto java.lang.reflect.Method del método que deseemos ejecutar para ellos antes debemos de obtener el java.lang.Class del objeto que contenga el método a ejecutar.

en nuestro ejercicio sera la clase de un objeto Cmd

Cmd cmd = new Cmd();
Class _classCmd = cmd.getClass();

Con ello tenemos el java.lang.Class en _classCmd del objeto cmd ahora para obtener el java.lang.reflect.Method haremos uso java.lang.Class.getMethod(String nombreMethod)

Method method = _classCmd.getMethod("help");

con esto buscamos el método “help” dentro del java.lang.Class, si no se encuentra ningún Method se lanzará una excepción java.lang.NoSuchMethodException, si lo encuentra lo retornará y lo asignamos a “method”

para ejecutar hay que invocarlo desde el objeto java.lang.reflect.Method (method) para ello usamos su mentodo .invoque(Object ObjetoQueContieneElMetodo)

method.invoke(cmd);

en este caso se esta llamando ejecutar al método “help()” que no contenga parámetros en el objeto cmd

para finalizar aquí esta la versión “final” del CMD utilizando reflexión

package reflexion;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;

/**
 *
 * @author fcodiaz
 */
public class exec {
   public static Scanner sc = new Scanner(System.in);
   public static void main(String args[]) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
      Cmd cmd = new Cmd();
      String coman = "";
      while (true) {
         try {
            coman = sc.nextLine();
            Class _classCmd = cmd.getClass();

            Method method = _classCmd.getMethod(coman);
            method.invoke(cmd);
         } catch (NoSuchMethodException e) {
            System.out.println("el comando " + coman + " no existe ");
         }
      }
   }
}

como verán es un programa mas pequeño que la primera versión, ademas de que al usar reflexión para ejecutar el “comando” en exec.java no tendremos que conocer la estructura de la clase cmd.java y con ello podemos agregarle métodos al cmd.java sin tener que tocar exec.java, pues hasta aqui este post, aun me queda mucho por mostrar reflexión

Download Proyecto Netbeans 6.9

jQuery plugin onKeyEnter, ejecutar un callback al ...

January 24th, 2011 by pako received No Comments »

onKeyEnter, es un mini-plugin de JQuery sive para ejecutar una función cuando se tecleé un Enter, esto es algo sencillo de lograr con jQuery, pero aquí lo encapsulo en un plugin para que aun sea un poco mas sencillo

para realizar esta función en jQuery debemos de hacer algo así

$(".unInputText").keydown(function(e){
    if(e.keyCode == 13){
      alert("diste Enter");
      //Aki código a ejecutar
   }
})

es sencillo si solo se desea hacer en un control, pero si son varios el pequeño if(e.keyCode==13) se puede volver repetitivo, para no tener que repetir esta pequeña porción de código envolví esta función en este miniplugin

/*
fcodiaz@devtics.com.mx
24/01/2011
www.devtics.com.mx
MIT/GNU
*/
/*keyEnter*/
(function($){
   $.fn.onKeyEnter=function(callback){
      var $this=$(this)
      $this.keydown(function(e){
         if(e.keyCode == 13){
           return callback.call(this,e);
         }
      })
      return $this;
   }
})(jQuery);

por lo que una vez que tengas el plugin disponible podrás realizar esto:

$(".unInputText").onKeyEnter(function(e){
      alert("diste Enter");
});

ademas se puede consumir el evento retornando un false desde la callback, con esto puedes cancelar por ejemplo el envió de un form.

el callback se ejecutara en contexto del elemento seleccionado, por lo que al hacer referencia a this dentro del callback haces referencia al elemento donde se recibió el enter, se recibe un único parámetro que es el objeto Event

El plugin es muy pequeño así que no dejo archivo .js en lugar de esto copia el código del plugin y pegalo ya sea al final de tu librería de jQuery o en alguna otra que utilices dentro de la pagina donde quieras usarlo, solo recuerda colocarlo después de la librería de JQuery

Unir palabras separadas por comas u otro caracter

November 23rd, 2010 by pako received No Comments »

les dejo una función bastante sencilla para cuando necesiten unir diferentes palabras con comas y si un texto es nulo o un espacio en blanco se elimine, esta función nació ya que algún día estuve recuperado campos de una base de datos (país,colonia,ciudad,estado), para formar la dirección tenia que concatenar estas variables tarea fácil el problema es que algunas veces unos campos no existían, por lo cual tenia que excluirlo y que no aparecieran “, ,” si no solo la lista de palabras que cotenieran algun texto

String.joinStrings=function joinStrings(){
 var arr =[],arg, i;
 if(typeof arguments[0] !="string" && arguments[0].length){
    for(i=0;i<arguments[0].length;i++){
     if((arg=arguments[0][i])){
        arr[arr.length]=arg;
     }
    }
 }else{
  for(i=0;i<arguments.length-1;i++){
    if((arg=arguments[i])){
        arr[arr.length]=arg;
    }
  }
 }
 return arr.join(arguments[arguments.length]);
}

Ejemplo:

cad1="hola";
cad2="";
cad3="ok"
cad4=""
alert(String.joinStrings(cad1,cad2,cad3,cad4,","));
alert(String.joinStrings(["hola","mundo","","ok"],","));

out:
hola,ok
hola,mundo,ok

getKeyAsc obtener el valor de un indice en un Arra...

July 27th, 2010 by pako received No Comments »

Aquí les dejo una pequeña función que se me ocurio formar a partir de un twitt del buen @danielniquet quien buscaba una forma de recuperar un elemento de un array asociativo sin que afectara el case sensitive de PHP, de forma nativa al parecer PHP no cuenta con una función que haga esto ya que digamos por “políticas” de php los keys de los arreglos asociativos son evaluados con case sensitive, por lo tal si en un array tengo el key “Mensaje” y trato de recuperar con $arr['mensaje'] no me retornara el valor ya que tiene que ser escrito el key exactamente igual $arr['Mensaje'], getKeyAsc en base solo hace posible recuperar el valor de un key sin que nos afecte esto, cabe destacar que lo que se hace es buscar comparando los key y en cuanto se encuentre el primer key que pasado a minúsculas sea igual al segundo parámetro que seria el key buscado de igual se pasa a minúscula cuando sean iguales se retorna el valor esto puede generar un error si tenemos los indices “mensaje” y “Mensaje” la función retornaría el primero que encontrara.

/*
FcoDiaz
www.devtics.com.mx
27/jul/2010
*/
function getKeyAsc($arr,$strIndex,$caseSesitive=false){
	if($caseSesitive)return $arr[$strIndex];
	foreach($arr as $i => $v)
	   if(strtolower($i)==strtolower($strIndex))return $v;
        return null;
}

Ejemplos

$arr=array("frutA"=>"naraja","noMbre"=>"pako","musiC"=>"rock");
echo "->{$arr["music"]}n";
echo "->{$arr["FRUTa"]}n";
echo "->{$arr["frutA"]}n";
echo "->".getKeyAsc($arr,"music")."n";
echo "->".getKeyAsc($arr,"FRUTa")."n";

Out:

->
->
->naraja
->rock
->naraja

Cambiar Wallpaper de GNOME con PHP-CLI Automaticam...

July 25th, 2010 by pako received No Comments »

Buscando un comando para cambiar el wallpaper desde la consola en linux, se me ocurrió hacer un deamon para que este se cambiara automáticamente, así llegue a este pequeño script en PHP que cambia el papel tapiz en un determinado tiempo tomando las imágenes aleatoriamente de una carpeta

Quien en realidad hace la magia es el comando gconftool-2, el cual nos permite manipular el gconf-editor que seria como “el regedit” de gnome desde donde se pueden manipular diferentes aspectos del entorno Gnome

Yo he utilizando Ubuntu10.4 y PHP5.3 con CLI y me ha funcionado de maravilla espero a ustedes les funcione.


Para cambiar el papel tapiz de linux con gnome desde la linea de comando debemos de editar la variable /desktop/gnome/background/picture_filename del gconf-editor a la cual se le asignará la ruta a la imagen que queremos de papel tapiz. Para hacerlo desde consola como lo comente nos valemos de comando gconftool-2 para ello ejecutamos el siguiente comando:


gconftool-2 -t str -s /desktop/gnome/background/picture_filename /home/usuario/wallpaper.jpg

Ahora en PHP, podemos ejecutar comandos del S.O con las funciones system, exec, passthru o shell_exec, en el script utilizo exec, en algunos servidores de hosting por seguridad estas funciones las deshabilitan :(, pero por lo pronto esto no nos afecta ya que se supone este script correrá en nuestro Desktop y no en un servidor.

En PHP podemos crear deamons que se ejecuten como procesos independientes, entonces uniendo todo esto podemos crear un script que este corriendo en segundo plano y en determinado tiempo nos cambie el papel tapiz :)

Download Script phpcwall.php

#!/usr/bin/php
<?php
/*
 * Fco Diaz
 * www.devtics.com.mx
 * Twitter: @fcodiaz
 * 25/jul/2010
 */
$segundos = 5*60;//segundos a esperar antes de cambiar al siguiente wallpaper
$path = "/home/pakos/Pictures/wallpapers";//path de las imagenes

$pid = pcntl_fork();//se crea el pid de proceso
if($pid == -1)die("El Deamons no arranco");
if($pid) die("PID=$pidn");//salgo del padre y muestro su pid
posix_setsid();//con esto suelto la terminal para q el proceso quede independiente
$ultimoWall = false;
while( true ){//se cicla el proceso para q nunca termine
    $files = array();//inicializo el arreglo $files
    exec("ls $path/*.jpg",$files);//busco los .jpg en el $path indicado
    do{
        $newWall = $files[rand(0,count($files)-1)];
    }while($newWall == $ultimoWall);//si es el utimo wall cambio por otro
    $ultimoWall = $newWall;//el nuevo a la vuelta siguiete sera el ultimo wall
    exec("gconftool-2 -t str -s /desktop/gnome/background/picture_filename "{$newWall}"");//coloco el papel tapiz
    exec("gconftool-2 -t str -s /desktop/gnome/background/picture_options zoom");//le digo a gnome que haga un zoom a la wallpaper si no se ajusta en la resolución
    sleep($segundos);//se duerme el proceso por el tiempo indicado
}

ahora para arrancar nuestro deamons, tenemos que darle permisos de ejecución


chmod +x phpcwall.php

para ejecutarlo vasta con ejecutar

./phpcwall.php

pero el fin de un deamon es que no tengamos que inicializarlo nosotros, para ello podemos agregarlo al grupo de aplicaciones que se ejecutan al iniciar nuestra sesión para ello vamos a Sistema/Preferencias/Aplicaciones al Inicio

y agregamos nuestro script a la lista de aplicaciones

Con esto cada que iniciemos nuestro escritorio se arrancara este script y cambiara nuestro papel tapiz en el tiempo indicado en el script

¿Donde esta ifconfig en CentOS?

June 9th, 2010 by pako received 3 Comments »

Hoy estoy haciendo algunos experimentos bajo la distro de Linux CentOS, un comando muy requerido en el ambiente Linux es el ifconfig, que no es otro que el equivalente a ipconfig para aquellos que son windowseros xP, este comando nos da información acerca de nuestra configuración de red, pues bien al teclear el comando me lleve gran sorpresa al ver que no encontraba el comando, he usado varias distros base debían y siempre me había funcionado, inmediatamente googlie y encontré que ifconfig en CentOS esta en:

/sbin/ifconfig

Ok ya sé donde está!… pero no está disponible como comando, siempre hay que teclear toda la ruta, una solución para tener disponible el comando desde cualquier parte de Shell es crear un enlace simbólico a ifconfig en /usr/bin/, para ello tendremos que ser root, una vez logeado o “convertido” como root tecleamos


ln –s /sbin/ifconfig /usr/bin/ifconfig

Con ello ya tendremos ifconfig disponible en cualquier parte de nuestro shell =)

Google el patrocinador de JavaScript

May 23rd, 2010 by pako received 2 Comments »

En algunos foros y aquí no he dejado de dejar plasmado mi gusto y pasión por el lenguaje de scripting JavaScript(JS), Google siguiendo su tradición de conmemorar los eventos históricos importantes alguno que otro homenaje a personajes, programas, inventos, científicos. etc.. etc.. etc… el pasado Viernes 21 Google sorprendido a varios incluyéndome al cambiar un poco la dinámica de sus logos en esta ocasión google coloca una imagen conmemorando el 30 aniversario del uno de los grandes clásicos de los videojuegos pacman, pero esta imagen tiene algo en particular, es una imagen que atreves de la técnica de sprite y un excelente trabajo en javascript logran un mini-juego de pacman.. Basado solamente en CSS/Javascript/DOM, algo que para muchos resulta increíble, hubo quien al ver, casi afirmo que se trataba de HTML5-Canvas, pero no, es un par de png’s y un rutinario JS que bien pudimos haber programado hace 10 o 12 años… incluso tuve una pequeña discusión por el origen de ese script ya que incluso hay quien asegura que se pudo haber utilizado GWT pero la verdad lo dudo por que el código pese a estar compactado para producción al pasarlo por una herramienta para reordenarlo queda muy limpio y entendible algo imposible para un código generado por GWT.

Tengo tiempo queriendo escribir algo que me molesta un poco de los programadores actuales más aun, de los que migran de la programación tradicional a la web, en lo personal inicie con a programar en C/C++ en mis clases de bachiller, por gusto incursione en la programación web, en aquel entonces 2001, la Web aun no dejaba de ser un periódico mural donde solo se mostraba información y muy pocas páginas iniciaban a tener comunicación en dos vías(un librito de visitas), que el usuario subiera información al web, tenían poco tiempo los web mails, poco se sabía de paginas conectadas a bases de datos y mucho menos se sabía de la existencia de técnicas como AJAX aunque se podía lograr algo muy parecido, en IE ya existía XHR!, en ese tiempo conocí un poco de Javascript y algo de PHP, vi como podían interactuar y lograr verdaderos sitios muy ricos y que a la larga se convertían en sistemas de información y ya no solo una revista, que podía atreves de una web alimentar una DB, en el servidor procesar esa información y atreves de la web manipularla y consultarla. Lo que se venía haciendo en los sistemas de escritorio tradicionales y afortunadamente evite la tentación de aprender e invertir mi tiempo en aprender Java por aprender y perfeccionar HTML/CSS/JavaScript/PHP/MySQL, creo que fue una buena elación hoy Java sigue siendo muy potente pero incluso al llegar al Java EE terminas haciendo lo que se hace en PHP claro con algunas mejoras en los procesos del lado servidor pero al final caemos a lo mismo y creo la tendencia hoy día esta mas que clara.

Creo que Google a creado una Joya de la programación en JS, es una muestra de su potencial, creo que es una lástima y es algo que me llega a molestar es que pocos programadores crean en este lenguaje y su falta de interés por invertir en aprender este lenguaje, hoy veo incluso que en foros se hablar más de librerías como jQuery que también es joyas del JS, pero le quitan el crédito principal a JS incluso muchos novatos y no tan novatos creen que al programar un Script JS que use jQuery están programando en algo distinto a JS, algo que para mí me parece lamentable, el uso del término AJAX para el manejo general del objeto XHR es otra cosa que me parece lamentable y no deja de molestar ya que se le quita el crédito al lenguaje muchos creen que AJAX es otra cosa e incluso le llaman “tecnología” pero no todo esto no es más que simple y sencillo JS común y corriente y aun así hay quien sigue creyendo que es un lenguaje débil al cual no hay que invertir mucho tiempo en aprender, o siguen anteponiendo el adjetivo “dificil “ y buscan atajos para no aprender.. Llámense frameworks(ZK, GWT, XAJAX) o librerías como jQuery

Google ha sido el Gran patrocinador de JavaScript no solo con la creación de este juego conmemorativo, si no porque prácticamente todas sus app’s están basadas en este lenguaje en el lado cliente he allí su Gmail o sus Google Docs o su potente y tan incomprendido Google Wave todas ellas aplicaciones RIA basadas en JS. Este post no es más que una invitación a los programadores a invertir un poco de tiempo en aprender JavaScript fuera de librerías esto al final le ayudara incluso a comprender y explotar mejor librerías tipo jQuery incluso crear grandes aplicaciones con solo JS/HTML/CSS,JS se puede orientar a objetos aunque con algunas diferencias que notaran ya que JS no usa clase en su modelo de OOP lo cual afecta directamente al paradigma de herencia que solemos utilizar en lenguajes como Java es algo importante mencionar que es otro paradigma de OOP al cual le llaman OOP basado en Prototipos contario al de Java y otros que son basados a Clases, prometo crear algunos contenidos de JS Orientado a Objetos, bueno sin mas solo les invito a conocer este gran lenguaje muy desvalorado el cual a pesar de los años se sigue creyendo que es para trivialidades como la validación de un form.

Bueno recomendaciones, antes de entrar a JS, estudia HTML/CSS son indispensables, para JS hay muchos tutoriales por desgracia algo anticuados en cuanto a técnicas de calidad, utiliza cualquiera de tantos, posterior investiga algo de “JavaScript no obstructivo” y finaliza con DOM y OOP en Javascript, al final puedes apoyarte de librerías como jQuery, prototype o mooltools para hacer un poco más eficiente tu trabajo.
Suerte y en verdad no es pérdida de tiempo invertir en aprender JavaScript

Reflexión en Java III, Acceso y modificación de ...

April 30th, 2010 by pako received No Comments »

En el post anterior mostré como obtener las propiedades de una clase, ahora veremos cómo colocar valores y obtener los valores almacenados en las propiedades de un objeto de una clase desconocida, recuerden que la reflexión solo nos permite acceso a los recursos públicos de las clases.

Para iniciar nuevamente modifico un poco las cases que nuestro programa observará mediante reflexión

A.java

/**
 *
 * @author jfcodiaz
 * wariodiaz@gmail.com
 * www.devtics.com.mx
 * 17/04/2010
 */
public class A {
    public int n1;
    public int R;
    public int n2;
    public String nombre;
    public B b;
    @Override
    public String toString() {
        return "Esto es una clase A";
    }
    public void saludo(){
        System.out.println("Hola Mundo!");
    }
}

B.java

/**
 *
 * @author jfcodiaz
 * wariodiaz@gmail.com
 * www.devtics.com.mx
 * 15/04/2010
 */
public class B {
    public String propiedad1;
    public String propiedad2;
    @Override
    public String toString() {
        return "esto es una B";
    }
}

Solo he cambiado el acceso a R, en B a publico esto porque el objetivo de este post es mostrar el acceso, asignación y recuperación de las propiedades de una clase a través de reflexión lo cual solo se puede realizar con propiedades públicas.

Como vimos en el post anterior podemos saber el tipo de dato que almacena una determinada propiedad a través de objField.getType() el cual nos retornara un objeto Class el cual de igual forma podremos analizar si vamos al método .toString() del objeto devuelto podremos ver que nos retorna una cadena con el tipo de dato si este es nativo(int, short, boolean, char, float, double, byte, long) o bien la cadena “class”, un espacio y el nombre completo de la clase en el classPath (esto se vio en el ejemplo anterior)

La clase Class nos permite obtener su nombre con objClass.getName() el cual nos retorna el nombre de la clase o su ruta en el classpath al igual que si se trata de un tipo nativo el tipo de dato, con esto podremos crear un programa que analice la clase e identificar qué tipo de dato debemos colocar en cada una de las variables.

Para colocar un valor los objetos Field (java.lang.reflect.Field) cuentan con los siguientes métodos de los cuales sus nombres son muy descriptivos.

- set(Object obj, Object value) void
- setBoolean(Object obj, boolean z) void
- setByte(Ojbect obj, byte b) void
- setChar(Object obj, char c) void
- setDouble(Object obj, double d) void
- setFloat(Object obj, float f) void
- setInt(Object obj, int i) void
- setLong(Object obj, long l) void
- setShort(Object obj, short s) void

El primer primer parámetro es el objeto en el que se buscara la propiedad y se le asignara el valor del Segundo parámetro, los setter son para los tipos de datos nativos, para propiedades que sean objetos se utiliza el método set().

Para recuperar los datos utilizamos los siguientes métodos getters de los objetos Field también muy descriptivos

-get(Object obj) Object
-getBoolean(Object obj) boolean
-getByte(Object obj) byte
-betChar(Object obj) char
-getDouble(Object obj)double
-getFloat(Object obj) float
-getInt(Object ojb) int
-getLong(Object obj) long
-getShort(Object obj) short

El único parámetro es el objeto donde se buscará la propiedad y de igual forma se utiliza cada getter segun el tipo de dato una vez si es que se sabe el tipo de dato que se obtendrá si no puede utilizar el método get y luego analizar el objeto para saber que tipo de dato es, todos los objetos en java tienen el método .getClass() el cual nos retorna un objeto Class con clase del objeto

Por ultimo dejo un ejemplo donde se analiza crea un objeto de una clases desconocida y si se encuentran propiedades String o int se llama a su setter y posteriormente se muestra el valor de todos los atributos de un objeto de la clases indicada por ultimo el programa nos pregunta el nombre de una propiedad para conocer su valor.

import java.lang.reflect.Field;
import java.util.Scanner;
/**
 *
 * @author jfcoDiaz
 * www.devtics.com.mx
 * 18/04/2010
 *
 */

public class Reflexion3 {
    public static void main(String[] args) {
        String nombreClase = "";
        Class _class;
        Object obj;
        Scanner sc = new Scanner(System.in);
        Field[] propieties;
        try {
            nombreClase =  sc.nextLine();
            _class = Class.forName(nombreClase);
            obj = _class.newInstance();
            propieties = _class.getFields();
            for (int i = 0; i < propieties.length; i++) {
                Field field = propieties[i];

                String nameType = field.getType().getName();
                if (nameType.equals("int")) {
                    System.out.println("Escribe El Valor  que guardara en "+field.getName()+" (Solo Numeros Enteros) " );
                    field.set(obj, Integer.parseInt(sc.nextLine()));
                } else if (nameType.equals("B")) {
                    field.set(obj, new B());
                } else if (nameType.equals("java.lang.String")) {
                    System.out.println("Escribe El Valor que guardara " + field.getName());
                    field.set(obj, sc.nextLine());
                } else {
                    System.out.println("Este programa no soporta la asignacion de " + nameType);
                }
            }
            for (int i = 0; i < propieties.length; i++) {
                Field field = propieties[i];

                System.out.println(field.getName() + " vale " + field.get(obj).toString());
            }
            System.out.println("Escribe el nombre de una propiedad para conocer su valor");
            Field field = _class.getField(sc.nextLine());
            System.out.println("La Propiedad " + field.getName() + " vale " + field.get(obj).toString());
        } catch (InstantiationException ex) {
            System.out.println("Error al Crear el Objeto");
        } catch (IllegalAccessException ex) {
            System.out.println("Error al Crear el Objeto");
        } catch (ClassNotFoundException ex) {
            System.out.println("La " + nombreClase + " Clase Indicada no Existe en el ClassPath");
        } catch (NoSuchFieldException ex) {
            System.out.println("El objeto no cuenta con la propiedad indicada");
        } catch (SecurityException ex) {
            System.out.println("No se tiene acceso a la clase o propiedad");
        }
    }
}

Con esto ya he mostrado como analizar una Clase y obtener sus propiedades . crear un objeto de esta clase desconocida e interactuar con sus propiedades, en el siguiente post mostrare como conocer los métodos de una clase mediante reflexión.

Códigos Fuentes de ejemplos en Netbeans 6.8

<< Reflexión en Java I, Instancia una clase desconocidas en tiempo de ejecución
<< Reflexión en Java II, Obtener propiedades de una clase desconocidas en tiempo de ejecución

www.devtics.com.mx

Reflexión en Java II, Obtener propiedades de una...

April 28th, 2010 by pako received 2 Comments »

En el pos anterior mostré como instanciar un par de clases sencillas según una cadena obtenida desde el teclado esto sin saber que teclearía el usuario y sin usar if’s ni switch si no con la reflexión que es el mecanismo por el cual podemos conocer los detalles y manejar en tiempo de ejecución de una clase “desconocida” en codificación.
En este post mostrare como obtener información de las propiedades de nuestra clase.
Para este post he modificado las clases A y B, agregándole propiedades
classA

/**
 *
 * @author jfcodiaz
 * www.devtics.com.mx
 * 17/04/2010
 */
public class A {
    public int n1;
    private int R;
    public int n2;
    public B b;
    @Override
    public String toString() {
        return "Esto es una clase A";
    }
    public void saludo(){
        System.out.println("Hola Mundo!");
    }
}

classB

/**
 *
 * @author jfcodiaz
 * wariodiaz@gmail.com
 * www.devtics.com.mx
 * 15/04/2010
 */
public class B {
    public String propiedad1;
    public String propiedad2;
    @Override
    public String toString() {
        return "esto es una B";
    }
}

Como ya se menciono anteriormente lo primero que tenemos que hacer es obtener la clase y almacenarla en un objeto tipo Class para esto hacemos uso del método estático Class.forName(Stirng ClassName), la cual recibe como String el nombre de la Clase.

Java a través de la clase java.lang.reflect.Field representa las propiedades públicas una clase, solo tenemos acceso a las propiedades y métodos público de la clase por obvias razones no podemos ver los métodos y propiedades privadas.
Lo primero que tenemos que hacer es recuperar nuestra clase:

 Class _class = Class.forName("A"); 

Para obtener una propiedad la cual conocemos su nombre podremos usar el método _class. getField(String nombrePropiedad), en cambio si no conocemos el nombre de las propiedades que es lo más lógico en este tema. Podremos obtener una lista de las propiedades con _class.getFields() el cual nos retorna un array de Fields con las propiedades de la clase.

Field properties[] = _class.getFields();

Para saber el identificador del Field consultamos el método .getName del objeto Field
Podemos saber el tipo de dato de la propiedad consultado al método getType() del objeto Field, si es un dato primitivo nos retornara una cadena con el tipo de dato, si es una objeto no indicará la clase en el Classpath:
Reflexion2.java:

import java.lang.reflect.Field;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Pakos
 * www.devtics.com.mx
 * 17/04/2007
 */
public class Reflexion2 {
    public static void main(String[] args) {
        try {
            Class _class = Class.forName("B");
            Field properties[] = _class.getFields();
            for (int i = 0; i < properties.length; i++) {
                Field field = properties[i];
                System.out.println(field.getName() +" > "+field.getType());
            }
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Reflexion2.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Out:

propiedad1 > class java.lang.String
propiedad2 > class java.lang.String

Ahora si modificamos la clase para que liste la clase A esta debería de ser la salida:

Class _class = Class.forName("A");

Out:

n1 > int
n2 > int
b > class B

Observe que en no se lista la propiedad R de la clase A ya que esta es una propiedad privada

Con esto termino este post. En el próximo mostrare como podemos modificar y/o consultar el valor de las propiedades.
Código Fuente en proyecto NetBeans6.8

<<Reflexión en Java I, Instancia una clase desconocidas en tiempo de ejecución