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. if y and z or not part of class structure then in which part they belong
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 .
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.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.