我正在寻找一种方法来获取类中的所有公共属性以及对象的所有子类(属性的名称及其值)。 假设我们有一个People对象:
i
mport java.util.ArrayList;
public class People {
public ArrayList<Person> ppl= new ArrayList<Person>();
int count=2;
public People() {
ppl.add(new Person(55, "Daddy", "Long Legs"));
ppl.add(new Person(20, "Jhon", "Snow"));
}
public class Person{
public int age;
public Name name;
public Person(int age, String first, String last){
this.name = new Name(first, last);
this.age = age;
}
public class Name{
String first;
String last;
public Name(String first, String last) {
this.first = first;
this.last = last;
}
}
}
}
我在这里看到了一个参考文献(我无法评论那里,但我没有足够的积分): Java reflection get sub class variable values / get object instance from member field
并试图实现它,但我的输出是
ppl [People$Person@4aa298b7, People$Person@7d4991ad]
而我需要它需要进入每个Person并提取其变量(及其值)。我搜索了一些可以帮助我但是我找不到任何建议的信息?
答案 0 :(得分:1)
toString()
方法 您获得的内容People$Person@4aa298b7
是Object.toString
代表....
getClass().getName() + '@' + Integer.toHexString(hashCode())
恕我直言您需要覆盖两个类中的toString()
方法:Person
和Name
。
例如:
public class Name{
String first;
String last;
public Name(String first, String last) {
this.first = first;
this.last = last;
}
@Override
public String toString() {
return this.first + " " + this.last;
}
}
Person
类 如果这不合适,您可以使用如下反射获取字段名称和值:
public static void main(String[] args) throws IllegalAccessException
{
People pe = new People();
Field[] allFields = People.Person.class.getDeclaredFields();
for (Field field : allFields)
{
for (People.Person p : pe.ppl)
System.out.println("Name: " + field.getName() + ". Value: " + field.get(p));
}
}
输出:
Name: age. Value: 55
Name: age. Value: 20
Name: name. Value: Daddy Long Legs
Name: name. Value: Jhon Snow
Name: this$0. Value: People@677327b6
Name: this$0. Value: People@677327b6
注意:如果您不希望这2个最终值代表人们的丑陋结果,您可以:
Person
和Name
并将它们设为2个独立的班级toString()
class People
方法
如果要从内部类动态获取字段:
public static void main(String[] args) throws IllegalAccessException
{
Class[] allClasses = People.class.getClasses();
for (Class clazz : allClasses) {
Field[] allFields = clazz.getFields();
for (Field field : allFields) {
String className = clazz.getName();
String fieldName = field.getName();
System.out.println("Class name: " + className + " - Field name: " + fieldName + ".");
}
}
}
输出:
Class name: People$Name - Field name: first.
Class name: People$Name - Field name: last.
Class name: People$Person - Field name: age.
Class name: People$Person - Field name: name.
但不确定如何从ArrayList<Person>
....
答案 1 :(得分:1)
public People() {
ppl.add(new Person(55, "Daddy", "Long Legs"));
ppl.add(new Person(20, "Jhon", "Snow"));
for (Person person : ppl) {
System.out.println(person.name.last);
System.out.println(person.name.first);
System.out.println(person.age);
}
System.out.println("Size of list: " + ppl.size());
}
没有toString()方法的示例。
答案 2 :(得分:1)
我相信你能得到的最接近的问题是java: get all variable names in a class。
使用Field[] fields = YourClassName.class.getFields();
将所有类字段作为java.lang.reflect.Field返回。
您可以使用Field.getModifiers()和Modifier.isPublic(Modifier)检查字段是否公开。
您可以使用Object Field.get()获取字段值。
希望有所帮助。
答案 3 :(得分:1)
我同意@Jordi Castilla,你需要正确覆盖toString方法以获得正确的输出。
例如:
import java.util.ArrayList;
class People {
public ArrayList<Person> ppl= new ArrayList<Person>();
int count=2;
public People() {
ppl.add(new Person(55, "Daddy", "Long Legs"));
ppl.add(new Person(20, "Jhon", "Snow"));
}
@Override
public String toString() {
return "{ Count: "+this.count + " , People:" + this.ppl+" }";
}
public class Person{
public int age;
public Name name;
public Person(int age, String first, String last){
this.name = new Name(first, last);
this.age = age;
}
@Override
public String toString() {
return "{ Name: "+this.name + " , Age:" + this.age+" }";
}
public class Name{
String first;
String last;
public Name(String first, String last) {
this.first = first;
this.last = last;
}
@Override
public String toString() {
return "{ FirstName: "+this.first + ", LastName: " + this.last+ " }";
}
}
}
public static void main(String[] args) {
People ppl = new People();
System.out.println("OUTPUT => "+ ppl.toString());
}
}
//Output
OUTPUT => {
Count: 2 ,
People:[
{ Name: { FirstName: Daddy, LastName: Long Legs } , Age:55 },
{ Name: { FirstName: Jhon, LastName: Snow } , Age:20 }
]
}
答案 4 :(得分:1)
这是我做的一个递归方法(在我将一个toString方法添加到Name类之后)。这里是。但是,它仍然不会在ppl列表中打印变量名称:
private static String getAllFields(Object obj){
Class<?> objClass = obj.getClass();
StringBuilder res = new StringBuilder();
Field[] fields = objClass.getFields();
res.append(objClass+"\n");
for(Field field : fields) {
Class<?> type = field.getType();
String name = field.getName();
res.append(" name: "+name+ " ");
try {
Object value = field.get(obj);
res.append("value: "+value+ "\n");
if (!type.isPrimitive() && !name.contains("java.lang"))
{
res.append(getAllFields(value));
}
} catch (IllegalArgumentException | IllegalAccessException e) {
e.printStackTrace();
}
}
return res.toString();
}
这是输出:
class People
name: ppl value: [Daddy Long Legs 55 , Jhon Snow 20 ]
class java.util.ArrayList
name: count value: 2
注意输出中没有Person类名,或者那里有变量变量名的名称。我真的不明白为什么