11分钟理解Java反射


11分钟理解Java反射

星星在你的头顶上闪耀着,与你交互诉说的话语,一句一句地,如同星点般翩然落至眼前


一、简介

JAVA反射机制是在运行状态中.
对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性.

我们创建的每一个类也都是对象,即类本身是java.lang.Class类的实例对象。这个实例对象称之为类对象,也就是Class对象,或者类类型。

二、方法:

1.如何获取.Class文件对象

a.  通过Object类 getClass()方法获取 Class对象

b. 通过类名.class 方式 获取 Class对象

c.  通过反射的方式, Class.forName(String classname) 获取Class对象
public static Class<?> forName(String className)throws ClassNotFoundException
返回与带有给定字符串名的类或接口相关联的 Class 对象

2.通过反射,获取类中的构造方法,并完成对象的创建

  • 获取指定的构造方法

    public Constructor getConstructor(Class<?>… parameterTypes)

  • 获取指定的public修饰的构造方法

    public Constructor getDeclaredConstructor(Class<?>… parameterTypes)

  • 获取指定的构造方法,包含私有的

    public Constructor getConstructor(Class<?>… parameterTypes)

  • 获取所有的构造方法

    public Constructor[] getConstructors() 获取所有的public 修饰的构造方法 public Constructor[] getDeclaredConstructors() 获取所有的构造方法,包含私有的

3.通过反射, 获取类中的构造方法,并完成对象的创建

步骤:
a.获取字节码文件对象
b.通过字节码文件对象 ,获取到指定的构造方法
    getConstructor(参数);
c.通过构造方法,创建对象
    public T newInstance(Object... initargs)

4.私有构造方法,创建对象

a.获取字节码文件对象
b.通过字节码文件对象 ,获取到指定的构造方法
    getDeclaredConstructor (参数);
c.暴力访问
     con.setAccessible(true);
d.通过构造方法,创建对象
     public T newInstance(Object... initargs)

5.通过反射,获取Class文件中的方法

  • 获取指定的方法

    public Method getMethod(String name, Class<?>… parameterTypes)

  • 获取指定的public方法

    public Method getDeclaredMethod(String name, Class<?>… parameterTypes)

  • 获取指定的任意方法,包含私有的

    获取所有的方法:
    public Method[] getMethods()

    获取本类与父类中所有public 修饰的方法:
    public Method[] getDeclaredMethods()获取本类中包含私有的所有的方法

// 数组表示:new Class[]{String.class, String.class}

6.通过反射,调用方法

步骤:
a.获取Class对象
b.构造方法,创建对象
c.取指定的public方法
d.行方法
public Object invoke(Object obj, Object... args)

7.私有方法的调用:

a,获取Class对象
b,获取构造方法,创建对象
c,获取指定的private方法
d,开启暴力访问
m5.setAccessible(true);
e,执行方法
public Object invoke(Object obj, Object... args)

8.通过反射,获取成员变量

  • 获取指定的成员变量

    public Field getField(String name)

  • 获取public修饰的成员变量

    public Field getDeclaredField(String name)

  • 获取任意的成员变量,包含私有

    public Field[] getFields()

  • 获取所有public修饰的成员变量

    public Field[] getDeclaredFields()

9.通过反射,获取成员 变量,并赋值使用

步骤:
a. 获取字节码文件对象
b. 获取构造方法,创建对象
c. 获取指定的成员变量
d. 对成员变量赋值获取值操作
public void set(Object obj, Object value) // 赋值
public Object get(Object obj) // 获取值

10.私有成员变量的使用

步骤:
a. 获取字节码文件对象
b. 获取构造方法,创建对象
c. 获取指定的成员变量
d. 开启暴力访问
e. 对成员变量赋值获取值操作
public void set(Object obj, Object value) //赋值
public Object get(Object obj) //获取值

文章作者: Athink
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Athink !
评论
  目录