java reflection parameters constructor

java - ¿Cómo obtener los nombres de los parámetros de los constructores de un objeto(reflexión)?



reflection parameters (3)

Como se mencionó en los comentarios sobre la respuesta de Roman , los nombres de los parámetros se pueden recuperar si el compilador incluía símbolos de depuración, aunque no a través de la API estándar de Java Reflection. A continuación se muestra un ejemplo que ilustra cómo puede obtener nombres de parámetros a través de los símbolos de depuración utilizando la biblioteca de bytecode de ASM :

/** * Returns a list containing one parameter name for each argument accepted * by the given constructor. If the class was compiled with debugging * symbols, the parameter names will match those provided in the Java source * code. Otherwise, a generic "arg" parameter name is generated ("arg0" for * the first argument, "arg1" for the second...). * * This method relies on the constructor''s class loader to locate the * bytecode resource that defined its class. * * @param constructor * @return * @throws IOException */ public static List<String> getParameterNames(Constructor<?> constructor) throws IOException { Class<?> declaringClass = constructor.getDeclaringClass(); ClassLoader declaringClassLoader = declaringClass.getClassLoader(); Type declaringType = Type.getType(declaringClass); String constructorDescriptor = Type.getConstructorDescriptor(constructor); String url = declaringType.getInternalName() + ".class"; InputStream classFileInputStream = declaringClassLoader.getResourceAsStream(url); if (classFileInputStream == null) { throw new IllegalArgumentException("The constructor''s class loader cannot find the bytecode that defined the constructor''s class (URL: " + url + ")"); } ClassNode classNode; try { classNode = new ClassNode(); ClassReader classReader = new ClassReader(classFileInputStream); classReader.accept(classNode, 0); } finally { classFileInputStream.close(); } @SuppressWarnings("unchecked") List<MethodNode> methods = classNode.methods; for (MethodNode method : methods) { if (method.name.equals("<init>") && method.desc.equals(constructorDescriptor)) { Type[] argumentTypes = Type.getArgumentTypes(method.desc); List<String> parameterNames = new ArrayList<String>(argumentTypes.length); @SuppressWarnings("unchecked") List<LocalVariableNode> localVariables = method.localVariables; for (int i = 0; i < argumentTypes.length; i++) { // The first local variable actually represents the "this" object parameterNames.add(localVariables.get(i + 1).name); } return parameterNames; } } return null; }

Este ejemplo utiliza la API del árbol de la biblioteca ASM. Si la velocidad y la memoria son valiosas, puede refactorizar el ejemplo para usar su API de visitante .

Esta pregunta ya tiene una respuesta aquí:

Digamos que de alguna manera obtuve una referencia de objeto de otra clase:

Object myObj = anObject;

Ahora puedo obtener la clase de este objeto:

Class objClass = myObj.getClass();

Ahora, puedo obtener todos los constructores de esta clase:

Constructor[] constructors = objClass.getConstructors();

Ahora, puedo hacer un bucle a cada constructor:

if (constructors.length > 0) { for (int i = 0; i < constructors.length; i++) { System.out.println(constructors[i]); } }

Esto ya me está dando un buen resumen del constructor, por ejemplo, un constructor público Test (String paramName) se muestra como público Test (java.lang.String)

Sin embargo, en lugar de darme el tipo de clase, quiero obtener el nombre del parámetro ... en este caso "paramName". ¿Como podría hacerlo? Intenté lo siguiente sin éxito:

if (constructors.length > 0) { for (int iCon = 0; iCon < constructors.length; iCon++) { Class[] params = constructors[iCon].getParameterTypes(); if (params.length > 0) { for (int iPar = 0; iPar < params.length; iPar++) { Field fields[] = params[iPar].getDeclaredFields(); for (int iFields = 0; iFields < fields.length; iFields++) { String fieldName = fields[i].getName(); System.out.println(fieldName); } } } } }

Lamentablemente, esto no me está dando el resultado esperado. ¿Podría alguien decirme cómo debo hacer esto o lo que estoy haciendo mal? ¡Gracias!


Esta información se pierde después de la compilación y no se puede recuperar en tiempo de ejecución.


Pruebe paranamer

Oh, por el amor de Dios SO, realmente, me vas a hacer ingresar al menos 30 caracteres para editar una respuesta existente para que sea correcta.