如何使用反射获取匿名类字段

时间:2015-05-11 09:33:46

标签: java reflection

这是我的示例类,我想通过使用反射得到y和z字段 在这一行(Field [] Fields = forName.getDeclaredFields();)我得到空数组。如果y和z或不是类结构的一部分,那么它们属于哪个部分

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;
    }
}

2 个答案:

答案 0 :(得分:1)

你需要操作匿名类,而不是封闭的外层类。

在下面找到一个简化示例来演示原理

// 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)
        );
    }
}

<强>输出

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


编辑获取没有对象引用的匿名类的字段名称。

// 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()
        );
}

<强>输出

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


编辑2 在下面找到一个片段,了解如何使用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);
}

<强>输出

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

答案 1 :(得分:0)

那是不可能的。 yz不属于类结构。