这是我的示例类,我想通过使用反射得到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;
}
}
答案 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)
那是不可能的。 y
和z
不属于类结构。