Obtner los getters

Hay alguna forma de recorre un objeto para obtener la referencia que retorna los getter.
algo dinámico.
Ejemplo
Persona persona = new Persona();
persona.setID(1);
persona.setNombre("JUAN");
persona.setEdad(18);

//Aqui hacer algun bucle para obtener la referencia que retornan los getters.

for(Persona p : persona){

//Aqui obtener los persona.getID(), persona.getNombre(), persona.getEdad(), una forma dinamica sin
escribir cada metodo getXXXX.

}

Saludos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Si usando Reflection

Como escribí acá

http://www.javamexico.org/foros/java_standard_edition/listar_todos_los_g...

Pero no debes de usarlo a menos que sepas que implicaciones tiene. Como bien menciona bferro ahi mismo, es muy costoso ( sobre todo si se puede evitar ) En ese ejemplo yo lo usé como debugger ( en un lugar donde no podía usar un debugger ) y después lo quité.

La alternativa ( que a veces yo ocupo ) es imprimirlos y luego hacer un copy paste de esa salida en mi código jejeje, así ya quedan bien escritos y se compilan correctamente.

Algo de eso me dijo google

Primero me indagare sobre reflection gracias.

Reducción del costo

Según lo que he estado leyendo de Scala en estos momentos, con Scala puedes hacerlo de manera menos costosa (aunque no sé si de manera más complicada o simple). Dado a la "naturaleza" propia de Scala.

Esta es una desventaja de los lenguajes compilados, la reflexión y demás cosas que se deben (o se tienen que) hacer en runtime.

Y porque no simplemente le

Y porque no simplemente le das click al link y que te pasé y ves como se hace?

¿Que es lo que quieres hacer? Quizá haya otra forma

Imagen de ezamudio

jajaj

Sí caray, esa gran desventaja de los lenguajes compilados. En los interpretados no es desventaja porque todo es igual de lento...

Lo que intento hacer

No quiero estar poniendo puesto.getBlablabla, obtenerlos de alguna manera manera recorriendo el objeto, sería más practico al usarlo en distintas tablas de BD.

public class PuestoModel {
private String[] items = {"pue_codigo","pue_nombre","pue_descripcion"};
private String table="puestos";

public void guardarActualizar(Puesto puesto){
String sql="";
try {
if(puesto.getId()==0){
puesto.setId(autoincremento());
sql="INSERT INTO "+table+" ("+items[0]+","+items[1]+", "+items[2]+") VALUE ("+puesto.getId()+",'"+puesto.getNombre()+"','"+puesto.getDescripcion()+"')";
}else{
sql="UPDATE "+table+" SET "+items[1]+"='"+puesto.getNombre()+"',"+items[2]+"='"+puesto.getDescripcion()+"' WHERE "+items[0]+"="+puesto.getId()+"";
}
ControladorBD.addSql(sql);
ControladorBD.execute();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
}

Imagen de ArenasMx

no se podría hacer un solo

no se podría hacer un solo get()? que contenga todos lo datos que necesitas en un orden que necesitas y manipularlo para después insertarlo a una base de datos?

Ahh vaya.. y supongo que

Ahh vaya.. y supongo que tampoco quieres usar un framework que haga esto por tí como Hibernate?

Lo que yo haría es algo como esto ( siguiendo la recomendación de ezamudio) :

 javap ElNombreDeTuClase | sed 's/.*\(get.*\);.*/items[i]=persona.\1/'

Por ejemplo en la siguiente clase:

$ cat P.java

class P {
        public String getNombre(){ return "";}
        public String getApellido(){ return "";}
        public String getDireccion(){ return "";}
        public String getTelefono(){ return "";}
        public String getEtc(){ return "";}
}

Me sale:

 javap P | sed 's/.*\(get.*\);.*/items[i]=persona.\1/'
Compiled from "P.java"
class P extends java.lang.Object{
    P();
items[i]=persona.getNombre()
items[i]=persona.getApellido()
items[i]=persona.getDireccion()
items[i]=persona.getTelefono()
items[i]=persona.getEtc()
}

Después eso lo puedes copy/paste'ear en tu código y listo.

Por cierto es mucho mejor usar un prepared statement sobre todo si los datos vienen de fuera. Acuerdensé de Bobby tables

No entendi a que te refieres

podrias explicarlos con palitos y bolitas.

Entendido oscar

Gracias oscar entendido

Dudilla con los i

los [i] se remplazan con posiciones
[0]
[1]
[2]

Si lo que no entendiste es lo

Si lo que no entendiste es lo de Bobby tables, considera que pasaría si el puesto se llamara:

" a ; drop table puestos; --";

Tip: Usa Prepared statements para evitar un ataque de SQL Injection

Okay usare Prepared statements ultima dudilla

public void guardarActualizar(Puesto puesto){
//En esta parte van los elementos del vector items?
items[0]=persona.getId();
items[1]=persona.getNombre();
items[1]=persona.getDescripcion();
try {

} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}

Re: jajaj

Cierto, el desempeño es una de las desventajas del scripting. Pero a nivel de reflexión y metaprogramación es casi transparente, hacerlo con Ruby (¬¬, si otra vez más metiendo a Ruby jeje) es simple e incluso es muchas veces el uso de los lenguajes de script (o al menos es lo que he visto/leído, favor de corregir si estoy mal).

Pero es cierto que por ejemplo Ruby es infinitamente más lento que Java...Lo último que supe era que Python era el lenguaje de scripting más rápido y pues la verdad he visto a más de uno con cosas así.

Por cierto, Java también es

Por cierto, Java también es interpretado pero su tipeo estático le da una ventaja extra. Además su intérprete ( la JVM ) es muuuuuy bueno y puede crear código de máquina en tiempo de ejecución. A diferencia de lenguajes como C o C++ que una vez que el código fue creado no puede hacer más optimizaciones.

Imagen de CharlieCorner

Sé que es un tanto offtopic

Estaba leyendo la documentación en la liga pero por lo que leo, los Prepared Statements son para mandar un precompilado de la sentencia SQL al DBMS. Nunca he usado ese tipo de objeto, siempre creaba mi método de 0 que depuraba todo lo que pudiese ser una sentencia "envenenada" para SQL Injection. ¿El PreparedStatement ya regresa una sentencia precompilada y depurada de todo caracter explotable por SQL Injection?

Imagen de ezamudio

PreparedStatement es una sentencia lista para enviarse al servidor de base de datos, con el SQL por una parte y los parámetros por separado, de modo que no sea posible inyección de SQL.