我有一个Java对象'ChildObj',它从'ParentObj'扩展而来.现在,如果可以使用Java反射机制检索ChildObj的所有属性名称和值,包括继承的属性?
Class.getFields为我提供了公共属性数组,Class.getDeclaredFields为我提供了所有字段的数组,但它们都没有包含继承的字段列表.
有没有办法检索继承的属性呢?
我正在做大学项目.
我需要从课堂上获得所有领域.甚至私人和继承.我试图获取所有声明的字段,然后转换为超类并重复.我的代码片段:
private void listAllFields(Object obj) {
List<Field> fieldList = new ArrayList<Field>();
while (obj != null) {
fieldList.addAll(Arrays.asList(obj.getClass().getDeclaredFields()));
obj = obj.getClass().getSuperclass().cast(obj);
}
// rest of code
Run Code Online (Sandbox Code Playgroud)
但它不起作用.tmpObj在铸造之后仍然是同一个类(不是超类).
我将不胜感激任何帮助如何解决铸造问题,或如何以不同的方式检索这些字段.
问题不是获取字段的访问权限,而是获取字段的名称!
我这样管理它:
private void listAllFields(Object obj) {
List<Field> fieldList = new ArrayList<Field>();
Class tmpClass = obj.getClass();
while (tmpClass != null) {
fieldList.addAll(Arrays.asList(tmpClass .getDeclaredFields()));
tmpClass = tmpClass .getSuperclass();
}
// rest of code
Run Code Online (Sandbox Code Playgroud) 我有2个班级:Father和Child
public class Father implements Serializable, JSONInterface {
private String a_field;
//setter and getter here
}
public class Child extends Father {
//empty class
}
Run Code Online (Sandbox Code Playgroud)
有了反射,我想a_field在Child课堂上设置:
Class<?> clazz = Class.forName("Child");
Object cc = clazz.newInstance();
Field f1 = cc.getClass().getField("a_field");
f1.set(cc, "reflecting on life");
String str1 = (String) f1.get(cc.getClass());
System.out.println("field: " + str1);
Run Code Online (Sandbox Code Playgroud)
但我有一个例外:
线程"main"中的异常java.lang.NoSuchFieldException:a_field
但如果我尝试:
Child child = new Child();
child.setA_field("123");
Run Code Online (Sandbox Code Playgroud)
有用.
使用setter方法我有同样的问题:
method = cc.getClass().getMethod("setA_field");
method.invoke(cc, new Object[] { "aaaaaaaaaaaaaa" });
Run Code Online (Sandbox Code Playgroud) 可能重复:
通过Java中的反射访问私有继承的字段
你好我hava用java反射的init值有问题.
我有简单的课程
public class A extends B {
private String name;
}
public class B {
private String superName;
}
Run Code Online (Sandbox Code Playgroud)
而且我也有简单的功能:
public void createRandom(Class<T> clazz , List<String> classFields){
try {
T object = clazz.newInstance();
for(String s : classFields){
clazz.getDeclaredField(s);
}
} catch(Exception e){
}
}
Run Code Online (Sandbox Code Playgroud)
我的功能做其他的东西,但我有问题,因为我有错误:
java.lang.NoSuchFieldException: superName
Run Code Online (Sandbox Code Playgroud)
如何使用反射从超类设置所有类字段也字段?
我有所有类字段(也继承),我正在使用函数,field.set(Object obj, Object value)但这样我不能设置继承的类字段:/
我没有问题得到所有类字段我使用Spring ReflectionUtils.doWithfield.我存储了所有字段名称List<String> classField,所以我知道所有clazz字段也都继承了.但我的问题是如何将值设置为所有clazz字段.
我有一个A类,私人成员是myMember.还有一个B级,有一个A级私人成员,叫做myA;
那是:
public class A{
private int myMember;
...
}
public class B{
private A myA;
}
Run Code Online (Sandbox Code Playgroud)
我希望能够访问:
B.myA.myMember;
Run Code Online (Sandbox Code Playgroud)
但似乎我不能,因为myMember在A中是私有的.事实上,我需要将A定义为私有用于练习(也包括它无法保护).有没有解决的办法?
谢谢.