2010-05-24 24 views
9

de esta manera, A a = new A(), ¿cómo puedo obtener el nombre? (Obtener una cadena "a" de a)?¿Cómo puedo obtener el nombre de un Objeto en Java?


No es un JPanel contiene algunos JTextFields, contiene un mapa de todos los nombres de las variables (los nombres) JTextFields. Quiero establecer los valores del mapa en los textos de JTextFields. Método

public void mapToJPanel(Map map, JPanel panel) { 
    Component[] compArr = panel.getComponents(); 
    for (Component comp : compArr) { 
     if (comp.getClass().getSimpleName().equals("JTextField")) { 
      JTextField textField = (JTextField) comp; 
      textField.setText(map.get(textField.getName()).toString());//getName() method 
     } 
    } 
} 

Accross getName(), me sale nula -_- Sé el método getName() no se utiliza para obtener el nombre de la variable. Estoy usando netbeans haciendo desarrollo visual Java swing, por lo que no puedo reescribir los componentes (como JTextField).

+5

puede explicar un poco en qué escenario esto sería útil? Supongamos que tiene 'A a = new A();', ¿qué esperaría que le devolvamos después de hacer 'A b = a;'? – akf

Respuesta

6

Puede usar Component.setName() para dar nombres a los componentes Swing y AWT.

+1

Quizás esta es la mejor solución :) –

6

No puede.

Si compila con símbolos de depuración, el archivo .class contendrá una tabla de nombres de variables (que es cómo los depuradores asignan variables a su código fuente), pero no hay garantía de que estará allí y no está expuesto en el tiempo de ejecución

0

Si bien puede obtener fácilmente el nombre de una clase de variable invocando .getClass(). GetCanonicalName() o .getClass(). GetSimpleName() (dependiendo de si desea el nombre completo), no es tan fácil de obtener el nombre de una variable. El bytecode de Java no necesita conservar los nombres de las variables locales (que se representan mediante operaciones push/pop en la pila); sin embargo, el bytecode de Java puede contener los nombres originales en los comentarios. Por lo tanto, podría intentar leer los archivos .class de los archivos .jar e intentar extraer los nombres de las variables de los archivos .class, suponiendo que el compilador los haya incluido como comentarios. En cuanto a las variables miembro (es decir, campos), puede usar la reflexión para obtener los nombres de campo de una clase.

+0

Tenga en cuenta que getClass le da la clase * object *, no la clase de la variable (es decir, si lo hace 'Object x =" hello "', 'x.getClass()' será String, no Object). No hay forma de obtener una clase de variable local del objeto al que apunta la variable, al igual que no hay forma de obtener el nombre de la variable. – sepp2k

+0

@ sepp2k, la distinción que está tratando de hacer entre "objeto" y "variable" es, creo, no estándar. Al tratar de hacer esa distinción, uno típicamente habla de "tipo de tiempo de ejecución" frente a "tipo de tiempo de compilación" o de "tipo de tiempo de ejecución" frente a "tipo declarado". Estoy usando "variable" de forma coloquial/suelta para referirme al valor indicado por la variable. –

+0

No sé si es un estándar (aunque sé que no soy la primera persona en hacerlo), pero creo que es importante entender que un objeto puede ser apuntado por más de una variable o por ninguna variable en todo, lo que hace que los conceptos como el nombre de un objeto carezcan de sentido. Creo que la distinción lo deja claro y, por lo tanto, es útil de hacer. – sepp2k

1

No puede y parece que está haciendo algo mal si necesita hacer esto. Sin embargo, si realmente desea seguir la lógica que ha descrito, ¿por qué no hace lo siguiente?

Agregue un miembro String a A y en un constructor, asígnelo. Algo como esto:

A a = new A('a'); 
16

No se puede, porque un objeto no tiene un nombre. Considere lo siguiente, por ejemplo:

A a = new A(); 
A b = a; 

¿Cuál es el "nombre" de la instancia A ahora? ¿Es "a"? ¿Es "b"?

¿Y qué tal esto?

A[] a = new A[] { new A(), new A()}; 
a[0] = a[1]; 

¿Cuál es el "nombre" de la instancia en a[1]?

Mi punto es que no se puede encontrar una definición útil/utilizable de un nombre universal de objeto Java que funcione en una amplia gama de contextos. Los problemas de bloqueo incluyen:

  • Estabilidad de nombre: un "nombre" que cambia cuando se asigna una referencia de objeto no es útil.
  • Nombre simple: un objeto no debe tener simultáneamente varios nombres.
  • Implementabilidad: cualquier sistema de nombres tendría que ser implementable sin imponer un costo de rendimiento en el uso normal de los objetos. AFAIK, esto es imposible ... al menos en el tipo de hardware que usamos actualmente.

Lo más cerca que Java tiene un nombre para un objeto es el valor del "código hash de identidad" del objeto. No es único, pero tiene la propiedad de que no cambiará durante el tiempo de vida del objeto en la JVM actual. (Pero incluso el código hash de identidad tiene un costo en tiempo de ejecución ... lo que lo convierte en un error de diseño Java en opinión de algunas personas).

El enfoque sensato para nombrar objetos es (como han dicho otros) agregar "nombre" campos a las clases relevantes (o use uno existente) y administre los nombres usted mismo según sea necesario.


En el caso más específico en el que el "objeto" es en realidad un JComponent, un componente dado no puede ser invocado para tener un nombre. (El método getName() puede devolver null). Sin embargo, si lo desea, puede recorrer cualquier jerarquía JComponent y establecer un nombre en cualquier componente según corresponda.

+0

Si "a" no es el nombre de un objeto, ¿cómo puede llamarlo? ¿Referencia de una dirección en la memoria reservada para un objeto? – sotirios

+1

It ('a') es el identificador (o" nombre ") de una variable que contiene una referencia al objeto. No es un "nombre" para un objeto porque la referencia en la variable se puede cambiar.Un "nombre" para un objeto no cambiaría solo porque lo asigné a una variable diferente. Nota: estoy usando "nombre" aquí de la misma manera que lo hizo la persona que escribió la pregunta original. –

+0

Entonces, cuando dices 'referencia', te refieres a dirección en la memoria, ¿verdad? Eso significa que, si tengo muchos objetos, tendré una dirección diferente para cada objeto. Eso significa que debo usar diferentes identificadores/variables para cada objeto. 'Stud a = new Stud ("John"); Stud b = Stud nuevo ("Michael"); '. ¿Es correcto? – sotirios

0

La replicación del nombre (símbolo) a es lo que es inconveniente y un poco ruidoso. En un lenguaje con macros, se podría definir esto para que la copia sea automática en el programa de código fuente.

make(A, a); 

o makea (a)

0

Usted puede intentar definir un nuevo objeto que se extiende (ya sea explícitamente o simplemente en función) del objeto original con un nuevo campo de cadena para el nombre del objeto. Luego proporcione los métodos para obtener ese nombre cuando lo necesite. Ese enfoque me ha funcionado bastante bien.

0

Siempre puede crear variables de nombre en la clase del objeto, y usar esa variable junto a otras para pasar información sobre este objeto.

-1

que tenían el mismo problema, buscar esa solución ...

DocumentoMB mb = new DocumentoMB(); 
    System.out.println(mb.getClass().getSimpleName()); 
+0

Eso le da el nombre de la clase, no' mb', el nombre de referencia del objeto –

Cuestiones relacionadas