1.反射(难点、尽量理解)
如:
Person p = new Person(); - 在运行阶段只能创建Person类型的对象
p.show(); - 在运行阶段只能调用show()方法
1.1 基本概念
反射本质上就是一种实现动态编程的机制,也就是说在运行阶段才能确定创建何种类型的对象以及调用何种方法的机制,具体的类型和方法由实参决定。
目前主流的框架技术底层都是采用反射机制实现的。
1.2 Class类
(1)基本概念
Class类的实例表示正在运行的Java应用程序中的类和接口,也就是代表一种数据类型。
Class类没有公共构造方法,Class类的实例是在类加载的过程中由Java虚拟机和类加载器自动构造的。
(2)获取Class类实例/对象的主要方式
a.使用数据类型.class的方式来获取对应的Class对象。
b.使用对象.getClass()方法的调用来获取对应的Class对象。
c.使用包装类.TYPE的方式可以获取对应基本类型的Class对象。
d.使用Class.forName()的方式来获取参数指定类型的Class对象。
(3)常用的方法
static Class<?> forName(String className) - 用于获取参数指定类型的Class对象。
T newInstance() - 使用当前正在调用对象所代表的类来构造新对象。
- 若当前正在调用对象代表String类,调用此方法就相当于new String()来构造对象。
- 若当前正在调用对象代表Person类,调用此方法就相当于new Person()来构造对象。
Constructor<T> getConstructor(Class<?>... parameterTypes)
- 用于获取当前正在调用对象所代表的类中参数指定的单个公共构造方法并返回。
Constructor<?>[] getConstructors()
- 用于获取当前正在调用对象所代表的类中所有的公共构造方法并返回。
Field getDeclaredField(String name)
- 用于获取当前正在调用对象所代表的类中参数指定的单个成员变量并返回。
Field[] getDeclaredFields()
- 用于获取当前正在调用对象所代表的类中所有的成员变量并返回。
Method getMethod(String name, Class<?>... parameterTypes)
- 用于获取当前正在调用对象所代表的类中参数指定的单个公共成员方法并返回。
Method[] getMethods()
- 用于获取当前正在调用对象所代表的类中所有的公共成员方法并返回。
1.3 Constructor类
(1)基本概念
java.lang.reflect.Constructor<T>类用于描述获取到的单个构造方法。
(2)常用的方法
T newInstance(Object... initargs)
- 用于当前正在调用对象所代表的构造方法来构造新实例,参数进行新实例初始化工作
1.4 Field类
(1)基本概念
java.lang.reflect.Field类用于描述获取到的单个成员变量。
(2)常用的方法
Object get(Object obj)
- 用于获取对象obj中当前正在调用对象所代表成员变量的数值并返回。
- 若参数传入Person类型的p对象,当前正在调用的对象代表成员变量name时,
调用该方法表示返回p.name的数值。
void set(Object obj, Object value)
- 用于将obj对象中当前正在调用对象所代表成员变量的数值修改为value。
- 若参数传入Person类型的p对象,当前正在调用的对象代表成员变量name时,
调用该方法则表示p.name = value的效果。
void setAccessible(boolean flag)
- 用于设置是否进行Java语言的访问检查,若给true则表示取消检查。
1.5 Method类
(1)基本概念
java.lang.reflect.Method类用于描述获取到的单个成员方法。
(2)常用的方法
Object invoke(Object obj, Object... args)
- 用于使用obj对象调用当前正在调用对象所代表的成员方法,实参传递args并返回。
- 若参数传入Person类型的p对象,当前正在调用的对象代表成员方法getName()时,
调用该方法则表示p.getName(args)的效果。