Java基础之-反射(三)

使用反射在运行时分析对象

在上一小节,我们了解了一些反射当中的方法,知道如何去查询任意一个对象的属性、方法和构造器。

  • 获取Class对象
  • 对象中获取这个类的属性 getDeclaredFields()…

在这一小节,我们将了解查看类具体内容。
下面我们看一段实例:将会有一些注释 希望小伙伴可以认真观看

package com.reflection;

import java.lang.reflect.Field;

public class ClassTest7 {
    
    
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    
    
        Student s = new Student("张三", 18, "湖南", 1);

        Class<? extends Student> c = s.getClass();

        //我们获取一个私有的name属性
        Field f = c.getDeclaredField("name");
        System.out.println(f);

        /*
            这段代码有一个问题。我们上面获取的是一个似有的属性,所以在get set中JVM会抛出一个
            illegalAccessException 只能对可以访问的字段使用get和set方法
            Java安全机制允许查看对象的属性 但是不允许读写那些字段的值(除非有权限)

            解决方案: 暴力反射
         */
        //暴力反射
        //小伙伴需要查看这段问题 首先把这段代码所注释掉
        f.setAccessible(true); //默认是false 现在我们就可以进行获取私有的属性值了

        Object o = f.get(s);
        System.out.println(o);


    }
}

setAccessible方法是AccessibleObject类中的一个方法,它是Filed、Method、Constructor类的公共父类。拥有这个特性是为了调试、持久存储和类似机制提供的。

介绍方法的作用:

  • void setAccessible(boolean flag)
    • 设置或取消可访问对象的可访问标志,如果拒绝访问抛出illegalAccessExcpetion异常
  • Field getFiled(String name)
  • Field[] getFileds()
    得到指定名的公共字段,或所有字段的一个数组
  • Field getDeclaredField(String name)
    • 得到类中声明指定的字段名
  • Object get(Object obj)
    • 返回obj对象中的属性值

猜你喜欢

转载自blog.csdn.net/ChengXuTeng/article/details/123967419