类加载:JVM首次使用某个类,这个类的信息需要加载到内存中,加载的信息有(属性、方法、构造方法、包名、父类名称....)
类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。
* 类加载时机:
* 创建对象
* 创建子类对象
* 访问静态成员
* Class.forName()
*
* 反射:当类首次加载到内存中,会将所有的信息存储到一个对象中,这个对象我们称之为类对象,可以使用这个类对 象获得该类中所有的
* 属性、方法、构造方法并且使用。
JAVA反射机制是在运行状态中,
对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意方法和属性;
这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
*
* 如何获取类对象:
* 1.对象名.getClass()
* 2.数据类型.class
* 3.Class.forName(String classpath):通过类的全路径(包名+类名)得到这个类的类对象
*
* 开发中用第三种:因为方法接收的是一个字符串,将来这个字符串可以写到配置文件中。
如何获取构造方法并使用
Class类中获取构造方法的方式:
Constructor[] getConstructors():获取所有public修饰的构造方法
Constructor[] getDeclaredConstructors():获取所有的构造方法
Constructor getConstructor(Class<?>... parameterTypes):获取指定当个公开构造方法
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes):获取指定的构造方法
Constructor类中创建对象的方法:
Object newInstance(Object... initargs):创建对象
Constructor父类中的方法:
public void setAccessible(boolean flag):值为true表示取消java语言访问检查
如何使用属性
Class类中获取属性的方法:
Field[] getFields():得到所有的公开属性
Field[] getDeclaredFields():得到所有的属性
Field getField(String name):获取public修饰的属性
Field getDeclaredField(String name):获取指定属性
Field如何为属性赋值:
void set(Object obj, Object value)
如何使用方法
Class类中获取成员方法的方式:
Method[] getMethods():获取所有公开方法
Method[] getDeclaredMethods():获取所有方法
Method getMethod(String name, Class<?>... parameterTypes):获取指定的公开方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes):获取指定方法
Method类中执行方法:
Object invoke(Object obj, Object... args):方法执行