> 文档中心 > Java基础之-反射(三)

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对象中的属性值