简体   繁体   中英

how to get anonymous class fields by using reflection

here is my example classes, i want get y and z fields by using reflection in this line (Field[] Fields = forName.getDeclaredFields();) am getting empty array. if y and z or not part of class structure then in which part they belong

package test;

import java.lang.reflect.Field;

public class Reflection {

    static ClassLoader classLoader = null;

    public static void main(String[] args) {
        classLoader = Reflection.class.getClassLoader();
        Reflection r = new Reflection();
        r.getAnnClas();
    }

    private void getAnnClas() {
        Class<?> forName = null;
        try {
            forName = classLoader.loadClass("test.Wrirter");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Field[] declaredFields = forName.getDeclaredFields();
        for (Field field : declaredFields) {
            //here i canot find annoumouse calss filed Z
            System.out.println(field.getName());
        }
    }
}

package test;

import java.io.File;
import java.io.FileReader;

public class Wrirter {

    public Cb c= new Cb(10, 20) {
    public int z = 10;
    public int y=120;
       @Override
        public void doSom() {
          super.doSom();
          int cbf = getIntC() + getIntB();
        }
    };

    public Wrirter() {

    }


}

class Cb {

    public int c;
    public int b;

    public Cb(int c, int b) {
        this.c = c;
        this.b = b;
    }

    public void doSom() {

    }

    public int getIntC() {
        return c;
    }

    public int getIntB() {
        return b;
    }

    public int setIntC() {
        return c;
    }

    public int setIntB() {
        return b;
    }
}

You need to operate on the anonymous class, not on the enclosing outer one.

Find below an stripped down example to demonstrate the principle

// the outer class type
Class<?> forName = Wrirter.class;

// instance to investigate
Wrirter outerClass = new Wrirter();

// call the method which create an object of the anonymous class
outerClass.ann();

// get the field which holds a reference to the anonymous class
Field fieldAnonymousClass = forName.getDeclaredField("c");

// get the reference to the anonymous class
Object instanceAnonymousClass = fieldAnonymousClass.get(outerClass);

// get the class type of the anonymous class
Class anonymousClassType = instanceAnonymousClass.getClass();
System.out.println("anonymous class name: " + anonymousClassType.getName());

// get the declared fields of the anonymous class
Field[] declaredFields = anonymousClassType.getDeclaredFields();
for (Field field : declaredFields) {
    if (field.getType() == int.class) {
        // print the field name and its value
        System.out.printf("name: %s  value: %s%n",
                field.getName(),
                field.getInt(instanceAnonymousClass)
        );
    }
}

output

anonymous class name: Wrirter$1
name: y  value: 10
name: z  value: 20


edit Get the field names of the anonymous class without an object reference.

// assuming you have already the anonymous class name
Class<?> anonymousClassType = Class.forName("Wrirter$1");

// get the declared fields of the anonymous class
Field[] declaredFields = anonymousClassType.getDeclaredFields();
for (Field field : declaredFields) {
        System.out.printf("type: %s  name: %s%n",
                field.getType(),
                field.getName()
        );
}

output

type: int  name: y
type: int  name: z


edit 2 Find below a snippet how to get the class names referenced in the constant pool of a class using Javassist .

ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("Wrirter");
ConstPool classConstantPool = cc.getClassFile().getConstPool();
for (String className : (Set<String>) classConstantPool.getClassNames()) {
    System.out.println("className = " + className);
}

output

className = java/lang/Object
className = Wrirter$1
className = Wrirter

That's not possible. y and z are not part of the class structure.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM