[英]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. 这是我的示例类,我想通过在这一行中使用反射来获取y和z字段(Field [] Fields = forName.getDeclaredFields();)正在获取空数组。 if y and z or not part of class structure then in which part they belong 如果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;
}
}
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 . 编辑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);
}
output 产量
className = java/lang/Object
className = Wrirter$1
className = Wrirter
That's not possible. 那不可能 y
and z
are not part of the class structure. y
和z
不属于类结构的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.