该篇文章其实就注重两个点、是否有declared前缀,带有private的记得调用setAccessible
所涉及到的类:Class、Field、Construcotr、Method
Object类的getClass方法
类型.class 属性
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用来存储要创建对象的 全路径名称,之后读取这个字符串,用class.forName创建就可以了。以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
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算