下面是我的示例类,我希望通过在这行中使用反射来获取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;
}
}
这是不可能的y
和z
不是类结构的一部分。
您需要对匿名类进行操作,而不是对封闭的外部类进行操作。
下面是一个简单的例子来说明这个原理
// 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 … 或者您可以在运行时使用它为其构造函数查询 注意:我特意省略了将在此创建的对象强制转换为预