当前位置: 首页 > 知识库问答 >
问题:

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

钱跃
2023-03-14

下面是我的示例类,我希望通过在这行中使用反射来获取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个答案

章晋鹏
2023-03-14

这是不可能的yz不是类结构的一部分。

章乐逸
2023-03-14

您需要对匿名类进行操作,而不是对封闭的外部类进行操作。

下面是一个简单的例子来说明这个原理

// 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
 类似资料:
  • 基本上,我的要求是通过使用反射来获取超类对象,以便获得字段名及其值。 所以,我有一门课 现在我正在使用 当我尝试使用以下代码访问该字段时,它会给我java.lang.Class类的类型。 它让我异常 有人能帮助我如何将其转换为对象,以便我可以访问文件夹

  • 我知道如果我们知道注释类,我们可以很容易地获得特定的注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类没有预先了解。我只想在运行时使用反射来获取所有注释类名及其属性,以便将类信息转储为例如JSON文件。我怎样才能以简单的方式做到这一点。 此方法将仅返回注释接口的动态代理。

  • 我正在创建许多POJO,并且必须为每个POJO创建方法。我认为创建一个类来使用反射API为我完成工作会更容易——在一个地方创建功能并在每个POJO中使用它。 POJO中的所有字段都是私有的。POJO是JSON对象的Java对象表示。 要求是遍历类中的字段,并列出字段和值。 我目前正在一个名为的类上测试该功能。 下面是我用来列出字段名和值的类: 我将< code>ChannelResource类的一

  • 问题内容: 我知道如果知道注释类,就可以轻松获取特定注释并访问其属性。例如: 它将返回特定注释接口的引用,因此您可以轻松访问其值。 我的问题是,我是否对特定的注释类不了解。我只想使用反射在运行时获取所有注释类名称及其属性,以将类信息转储为例如JSON文件的目的。我该如何轻松地做到这一点。 此方法将仅返回注释接口的动态代理。 问题答案: 与预期的相反,注释的元素不是属性-它们实际上是返回提供的值或默

  • 问题内容: 在这里打印“ Foo”的方式是什么?在此示例中,打印的是“字符串”。 http://play.golang.org/p/ZnK6PRwEPp 问题答案: 你要。上的方法将返回一个结构,该结构描述该字段,其中包括名称以及其他信息。 无法检索代表特定字段值的字段名,因为这是包含结构的属性。

  • 问题内容: 我无法获取字段值。我想做的是在运行时获取对象。请让我知道我要去哪里了。 测试类 } EX.class } 问题答案: 像这样 或者,您可以使用类的方法在运行时获取对象的实例。您仍然需要首先设置该实例变量,否则它将没有任何值。 例如 或者,在其构造函数中有两个参数的地方,例如String和int … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预