Es posible get nombres de variables locales programáticamente en Java o Kotlin?

Es posible get nombres de variables locales programáticamente en Java o Kotlin?

Por ejemplo, este código

public void printOneTwo() { int one = 1; int two = 2; printLocalVariables(one, two); } private void printLocalVariables(Objects... variables) { //code } //result: "one, two" 

Necesito convertir la variable one a la cadena "one"

Teóricamente, es posible.

Puede usar un analizador de código de bytes como ASM para extraer la tabla de variables locales de un método del file de class de la class declarante. Esta tabla contiene los nombres de todas las variables locales y una compensación de su validez para identificar el order de la statement.

Sin embargo, tenga en count que este atributo es opcional. Un comstackdor puede omitir la adición de esta información de debugging.

No, no es posible. Solo se pasan los valores de las variables, no hay datos disponibles que puedan darle el nombre.

En el caso, como en el caso de ejemplo, one y two estarán insertados en el sitio de llamadas y no dejarán rastro en el código comstackdo. UPS.

Si lo único que desea es un logging fácil, y está usando InteliJ (¡debería!), Entonces use templates de códigos. Permiten que uno use el nombre local, por lo que escribirá one.log<tab> y obtendrá one.log("one") , por ejemplo

Esta es una pregunta interesante. Pero, ¿cuál es el propósito? ¿Es solo un ejercicio?

Sí, get nombres de variables locales programáticamente es posible bajo ciertas condiciones.

  1. Según algunas definiciones, en java, los parameters de function son un tipo de variable local. Puede getlos, si el código se compiló usando información de debugging, con java reflection, method.getParameterTypes ()

  2. Si tiene un file .class comstackdo con información de debugging, puede leer las variables locales desde él, por ejemplo, utilizando el ClassReader de asm. El siguiente código examina los locales de la function f1 de la class A

Aquí está el código:

 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.LocalVariableNode; import org.objectweb.asm.tree.MethodNode; public class Example { public static void main(String[] args) throws FileNotFoundException, IOException { ClassReader reader = new ClassReader(new FileInputStream(new File("A.class"))); final ClassNode classNode = new ClassNode(); reader.accept((ClassVisitor) classNode, 0); for (final MethodNode mn : (List<MethodNode>)classNode.methods) { if ( mn.name.equals("f1")) for (LocalVariableNode n : (List<LocalVariableNode>)mn.localVariables) { System.out.println(n.name); } } } } 
  1. No estoy seguro de esto, pero creo que también podría hacerlo utilizando la class LocalVariable de la interfaz Java Debug
  • Acceda a las classs Apollo generadas desde el package secundario - Kotlin
  • Cómo usar Realm's en el método con Kotlin
  • ¿Las classs de Kotlin que henetworkingan de las classs de Java también henetworkingan de Cualquiera?
  • Llamada asincrónica para cada elemento dentro de una colección
  • Cómo usar Kotlin coroutines await () en el hilo principal
  • ¿Qué significa "::" en kotlin?
  • Java no permite los methods pnetworkingeterminados finales ... pero ¿Kotlin?
  • ¿Hay alguna forma de hacer BigDecimal más rápido que aquí?
  • Cómo get la class de parámetro genérico en Kotlin
  • Cargue la configuration xml del muelle de forma dinámica
  • Referencia de propiedad anidada Kotlin