反射方法 的简单使用

获得字节码文件对象的三种方式

  1. Object类的getClass方法

  2. 类型.class 属性

  3. Class.forName(“类的路径”)

    反射方法 的简单使用

都为true,内存地址是一样的。在程序的运行中,Person的class文件只被加载了一次。

反射方法 的简单使用

也为true,可知只加载了一次

反射方法 的简单使用

也为true

用字节码文件对象来构建一个类的对象

反射方法 的简单使用

字节码文件对象中包含:

那么 这4个字节码文件对象中叫什么呢?

java文件 字节码文件
字节码文件对象
构造方法 构造方法对象(类型Constructor)
成员变量 成员变量对象(类型Field)
成员方法 成员方法(类型Method)

之前一直用new的形式来创建一个类的对象

Person p = new Person()

加粗部分是类的构造方法,因为对象是通过构造方法创建的

用字节码文件中的构造器对象来创建一个类的对象——Constructor对象

反射方法 的简单使用

获得Constructor来创建对象

注意:getDeclaredConstructor(Class<?>… parameterTypes)
这个方法会返回指定参数类型的所有构造器,**包括public的和非public的,**当然也包括private的。
getDeclaredConstructors()的返回结果就没有参数类型的过滤了。

再来看getConstructor(Class<?>… parameterTypes)
这个方法返回的是上面那个方法返回结果的子集,只返回制定参数类型访问权限是public的构造器。
getConstructors()的返回结果同样也没有参数类型的过滤。

用反射有什么好处呢?之前Spring ioc有讲。可以通过配置文件动态创建对象:

来**:

创建一个a.txt用来存储要创建对象的 全路径名称,以Person为例

反射方法 的简单使用

获取名称后也可创建对象。

构造方法对象

四个访问修饰符:

反射方法 的简单使用

反射方法 的简单使用

getConstrustors是获取公有的,所以只有一个

反射方法 的简单使用

getDeclaredConstructors这个就是得到所有的

获取指定的构造器

反射方法 的简单使用

这是public的,如果不是public,使用getConstructor获得指定方法机会报NoSuchMethodException

反射方法 的简单使用

所以也是用带Declared的getDeclaredConstructor

那么其他访问修饰符呢?

反射方法 的简单使用

私有的可以得到构造器,但是不能创建对象

反射方法 的简单使用

通过constructor.setAccessible(true)设置为可以访问

方法对象

它也有这些

反射方法 的简单使用

反射方法 的简单使用

其他方法是因为还有Object的,当然这是public的,要所有的需要加上Declared

先给Person加上getter与setter,以及该类的一个私有方法

反射方法 的简单使用

反射方法 的简单使用

可以发现有以下的区别

1.不带declared是得到所有的public修饰的method 包括从父类继承过来的Declared

2.带declared是得到当前类中的所有Method

反射方法 的简单使用

注意,getMethod()是得到公有的方法,同样的也有getDeclaredMethod()

同样的,如果将getName()这个方法的访问权限改为私有的,那么也将报 **IllegalAccessException **

反射方法 的简单使用

那么也是一样的,需要设置一下

反射方法 的简单使用

得到属性对象

getField跟getDeclaredField,跟上面的一样的。因为这里是private

反射方法 的简单使用

相关文章: