Class对象  

这篇文章算是补充的一点东西,主要看一看Class对象的相关知识。
主要关心的有以下几个点:

  1. Class对象是什么?
  2. Class对象和反射
  3. Class对象如何使用

Class对象是什么

可以简单这么说:Class对象就是字节码文件存储的内容。所以将字节码加载进入内存中时,即在内存中生成了Class对象(Class对象和普通对象一样,也是存放在堆中;尽管加载进来的类信息是放在方法区当中的,这点要注意!)。

有Class对象,就有Class类。Class类、Class对象,普通类、普通对象的关系如图:

Class对象的作用是:在运行时期提供或者获得某个对象的类型信息,这对于反射比较重要。

Class对象与反射

反射是指在运行时,对于任意一个类,都能够动态地获得并使用其成员属性和方法。

语言的动态性是指,在运行时能够改变结构或变量类型。Java语言是静态语言,正是通过反射,才实现了动态性。Spring等框架也是基于反射才有了实现的可能。

如何获得Class对象

三种方法:

  1. Class.forName("xxx"); ——Class的静态方法
  2. obj.getClass(); ——继承自Object类的普通方法
  3. 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):调用指定对象的指定参数的方法。