java 反射

1.反射:
就是加载类,并解剖(反射)出类的各个组成部分(成员变量,方法,构造方法等),就是把java类中的各种成分映射成相应的java类。例如:一个java类用一个Class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等等信息也用一个个java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获得其中的变量、方法、构造函数、修饰符、包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Constructor、Package等等。

2.加载类
java中有一个Class类用于代表某一个类的字节码
Class类既然代表某个类的字节码,它当然就要提供加载某个类的字节码的方法:forName()。forName方法用于加载某个类的字节码到内存中,并使用Class对象进行封装

另外两种得到Class对象的方式:
类名.class
对象.getClass()

3.解剖(反射)类
Class对象提供了如下常用方法:
//.调用下面的方法,可以获得声明为public型的成员变量、方法、构造方法的对象数组
Public Constructor getConstructor(Class<?>... parameterTypes)
Public Method getMethod(String name, Class<?>... ParameterTypes)
Public Field getField(String name)

//.调用下面的方法,可以获得所有声明的成员变量、方法、构造函数的对象数组
Public Constructor getDeclaredConstructor(Class... parameterTypes)
public Method getDeclaredMethod(String name, Class... parameterTypes)
public Field getDeclaredField(String name)

这些方法分别用于从类中解剖(反射)出构造函数、方法和成员变量。解剖(反射)出的成员分别使用Constructor、Method、Field对象表示

4.反射的基石 -> Class类
Java类是用于描述一类事物的共性,该类事物有什么属性,没有什么属性。至于这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有什么不同的属性值。
Java程序中的各个java类,他们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写的class关键字的区别。
形象对比:众多的人用一个什么类表示?众多的java类用一个什么类表示?
- 人 -> Person类
- Java类 -> Class类
Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属的包名,字段名称的列表,方法名称的列表,等等。

Person类代表人,它的实例对象就是张三、李四这样一个个具体的人,Class类代表java类,它的各个实例对象又分别对应什么呢?对应各个类在内存中的字节码,例如:Person类的字节码、ArrayList类的字节码,等等。
一个类被类加载器加载到内存中,占用一块存储空间,这个空间里面的内容就是类的字节码,不同类的字节码是不同的,所以他们在内存中的内容是不同的,这一个个的空间可分别用一个个的对象来表示,这些对象显然是Class类的对象实例。

如何得到各个字节码对应的实例对象(Class类型)?
- 类名.class,例如:System.class
- 对象.getClass(),例如:new Date().getClass()
- Class.forName("类名"),例如:Class.forName("java.util.Date")

5. Constructor类
代表某个类中的一个构造方法
5.1得到某个类所有的构造方法:
Constructor[] cts = Class.forName("java.lang.String").getConstructors();

5.2得到某一个构造方法
Constructor cts = Class.forName("java.lang.String").getConstrctor(StringBuffer.class);

5.3创建实例对象n
通常方式:String str = new String(new StringBuffer("abc"));
凡事方式:String str = (String)cts.newInstance(new StringBuffer("abc"));
5.4Class.newInstance()方法
String str = (String)Class.forName("java.lang.String").newInstance();

6.数组的反射
具有相同维数和元素类型的数组属于同一个Class类型,即具有相同的Class实例的对象。
代表数组的Class实例对象的getSuperclass()方法返回的父类为Object类对应的Class。
基本类型的一维数组可以被当作Object类型使用,不能当作Object[]类型使用,非基本类型的一维数组,既可以当作Object类型使用,又可以当作Object[]类型使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值