java反射学习二

总结自《Java核心技术卷Ⅰ》

通过上一篇博客的学习,我们已经知道如何查看任意对象的数据域名称和类型:
1.获得对应的Class对象
2.通过Class对象调用getDeclaredFields

一.下面我们进一步学习查看数据域的实际内容(值)。利用反射机制可以查看在编译时还不清楚的对象域。查看对象域的关键方法是Field类中的get方法。

例如:
如果f是一个Field类型的对象,obj是某个包含f域的类的对象,则f.get(obj)将返回一个对象,其值为obj域的当前值。

代码:
1.Employee:

package day01;

public class Employee {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    public Employee(String name)
    {
        this.name=name;
    }
}

2.测试函数

package day01;

import java.lang.reflect.Field;

public class Reflection {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Employee harry = new Employee("Harry Hacker");
        Class cl=harry.getClass();
        Field f=cl.getDeclaredField("name");
        f.setAccessible(true);//必须有,否则无法访问name的值会出错,作用是将所有域设置成可访问的
        Object v=f.get(harry);
        System.out.println(v);//输出的是Harry Hacker
    }
}

我们还可以调用f.set(obj,value);将obj对象的f域设置成新值。

二.可以使用toString方法查看任意对象的内部信息。
在学习例子之前我们应先了解相关方法:
在这里插入图片描述
例子:
ObjectAnalyzer.java

package day01;

import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;

public class ObjectAnalyzer
{
    private ArrayList<Object> visited = new ArrayList<>();

    /**
     * Converts an object to a string representation that lists all fields.
     * @param obj an object
     * @return a string with the object's class name and all field names and
     * values
     */
    public String toString(Object obj)
    {
        if (obj == null) return "null";
        if (visited.contains(obj)) return "...";
        visited.add(obj);
        Class cl = obj.getClass();
        if (cl == String.class) return (String) obj;
        if (cl.isArray())
        {
            String r = cl.getComponentType() + "[]{";
            for (int i = 0; i < Array.getLength(obj); i++)
            {
                if (i > 0) r += ",";
                Object val = Array.get(obj, i);
                if (cl.getComponentType().isPrimitive()) r += val;
                else r += toString(val);
            }
            return r + "}";
        }

        String r = cl.getName();
        // inspect the fields of this class and all superclasses
        do
        {
            r += "[";
            Field[] fields = cl.getDeclaredFields();
            AccessibleObject.setAccessible(fields, true);
            // get the names and values of all fields
            for (Field f : fields)
            {
                if (!Modifier.isStatic(f.getModifiers()))
                {
                    if (!r.endsWith("[")) r += ",";
                    r += f.getName() + "=";
                    try
                    {
                        Class t = f.getType();
                        Object val = f.get(obj);
                        if (t.isPrimitive()) r += val;
                        else r += toString(val);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
            r += "]";
            cl = cl.getSuperclass();
        }
        while (cl != null);

        return r;
    }
}

测试代码:

package day01;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import java.util.ArrayList;

public class Reflection {
    public static void main(String[] args) {
        ArrayList<Integer> squares=new ArrayList<>();
        for(int i=0;i<=5;i++) {
            squares.add(i * i);
            System.out.println(new ObjectAnalyzer().toString(squares));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/106068091