In Java, how can I get the Fields that are used in a method ?
Basically, this is the same questions as this one in .NET. I dont wan't to list the fields from a Class, but to list the fields that are used in a given method of the class.
Example:
public class A {
 int a;
 int b;
public int bob(){
 return a-b;
}
I want to get the fields like this:
Fields[] fields = FieldReader.(A.class.getMethod("bob"));
So that fields[0]=A.a and fields[1]=A.b
I didn't find any solution using standard Reflection. Do you think bytecode manipulation library such as ASM are a way to go ?
Here is an example with javassist (you need to add it as a dependency, depending on your dependency manager preferences).
This code list the field being accessed in the public void doSomething(); method.
package bcm;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
import javassist.bytecode.InstructionPrinter;
public class Person {
    String name;
    String surname;
    int age;
    boolean candrink = false;
    public Person(String name, String surname, int age) {
        super();
        this.name = name;
        this.surname = surname;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSurname() {
        return surname;
    }
    public void setSurname(String surname) {
        this.surname = surname;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void doSomething() {
        if (this.age > 18) {
            candrink = true;
        }
    }
    public static void main(String[] args) throws IOException,
            CannotCompileException {
        ClassPool pool = ClassPool.getDefault();
        try {
            CtClass cc = pool.get("bcm.Person");
            CtMethod m = cc.getDeclaredMethod("doSomething", null);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PrintStream ps = new PrintStream(baos);
            InstructionPrinter i = new InstructionPrinter(ps);
            i.print(m);
            String content = baos.toString();
            for (String line : content.split("\\r?\\n")) {
                if (line.contains("getfield")) {
                    System.out.println(line.replaceAll("getfield ", ""));
                }
            }
        } catch (NotFoundException e) {
            e.printStackTrace();
        }
    }
}
HTH
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With