反射
1.1 基本概念
反射本质上就是一种动态编程的技术,可以在运行阶段动态地创建对象以及动态地调用方法,具体由实参决定。
优点:
1)动态的创建对象
2)动态的调用对象
缺点:
1)可读性差
2)编码的难度高
目前主流的框架技术底层都是反射的机制,如:structs、spring、hibernate等
普通的创建对象特点:代码简单、创建的对象台固定
如:
Person p = new Person(); - 只能创建Person类型的对象。
Student s = new Student(); - 只能创建Student类型的对象。
void show(){}
void show(int i){}
void show(double d){}
... ...
1.2 Class类
(1)基本概念
java.lang.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() - 根据Class对象创建新实例。
> Constructor<T> getConstructor(Class<?>... parameterTypes)
> - 用于获取当前Class对象对应类中指定的公共构造方法。
>
>Constructor<?>[] getConstructors()- 获取对应类中所有的公共构造方法。
>
>Field getDeclaredField(String name) - 获取对应类中指定的成员变量。
>
>Field[] getDeclaredFields() - 获取对应类中所有的成员变量。
>
>Method getMethod(String name, Class<?>... parameterTypes)
> - 用于获取对应类中指定的公共成员方法。
>
>Method[] getMethods() - 用于获取对应类中所有的公共成员方法。
1.3 Constructor类
java.lang.reflect.Constructor类用于描述获取到的构造方法。 T
newInstance(Object… initargs) - 调用当前描述的构造方法去创建新实例。
1.4 Field类
java.lang.reflect.Field类用于描述获取到的成员变量。
Object get(Object obj) -用于获取指定对象中此成员变量的数值。
void setAccessible(boolean flag) -参数为true表示可以访问私有成员。
void set(Object obj, Object value) - 用于修改指定对象中当前成员变量的数值。
1.5 Method类
java.lang.reflect.Method类用于描述获取到的成员方法。
Object invoke(Object obj, Object… args) - 用于obj对象调用当前方法,并传递args作为实参。