Class对象
这篇文章算是补充的一点东西,主要看一看Class对象的相关知识。
主要关心的有以下几个点:
- Class对象是什么?
- Class对象和反射
- Class对象如何使用
Class对象是什么
可以简单这么说:Class对象就是字节码文件存储的内容。所以将字节码加载进入内存中时,即在内存中生成了Class对象(Class对象和普通对象一样,也是存放在堆中;尽管加载进来的类信息是放在方法区当中的,这点要注意!)。
有Class对象,就有Class类。Class类、Class对象,普通类、普通对象的关系如图:
Class对象的作用是:在运行时期提供或者获得某个对象的类型信息,这对于反射比较重要。
Class对象与反射
反射是指在运行时,对于任意一个类,都能够动态地获得并使用其成员属性和方法。
语言的动态性是指,在运行时能够改变结构或变量类型。Java语言是静态语言,正是通过反射,才实现了动态性。Spring等框架也是基于反射才有了实现的可能。
如何获得Class对象
三种方法:
- Class.forName("xxx"); ——Class的静态方法
- obj.getClass(); ——继承自Object类的普通方法
- Object.class(); ——类字面量
Class对象如何使用
主要可通过Class对象获得构造器,静态/普通变量,静态/普通方法,需要用到下面三个类。
Constructor类:
首先获得类构造器,再用Constructor类中的方法来使用构造器。
1. 获得Constructor对象:
- getConstructor(Class<?>... parameterTypes):返回指定参数类型、public访问权限的构造器
- getDeclaredConstructor(Class<?>... parameterTypes):返回指定参数类型、所有访问权限的构造器
- getDeclaredConstructor():返回所有访问权限的构造器
2. 使用构造器
获得类的构造器后,可以用cons.newInstance(xx,xxx);来使用构造器来传入参数,创建对象。
Filed类
常见方法:
1. 获得Filed对象:
- getFields:获取public修饰的所有属性,返回一个Field数组(包括父类的)
- getDeclaredFields:获取所有属性,返回一个Field数组
- getField:传入一个参数(属性名),获取单个属性,返回一个Field对象,只能获取public修饰的
- getDeclaredField:传入一个参数(属性名),获取单个属性,返回一个Field对象
2. 操作属性:
myFiled.set(Object obj, Object value):设置指定对象中某个属性的值;
get(Object obj):获得指定对象中某个属性的值;
Method类
常见方法:
1. 获得Method对象:
- getMethods:获取所有的public修饰的方法,包括父类的,返回Method数组
- getDeclaredMethods:获取所有的返回,不包括父类,返回Method数组
- getMethod:传入一个参数(方法名),返回一个Method对象,只能获取到public修饰的
- getDeclared:传入一个参数(方法名),返回一个Method对象
2. 调用方法:
method.invoke(Object obj,Object... args):调用指定对象的指定参数的方法。