反射:
反射允许对成员变量,成员方法和构造方法的信息进行编程访问
成员变量:获取修饰符、获取名字、获取类型、赋值/获取值
构造方法:获取修饰符、获取名字、获取形参、创建对象
成员方法:获取修饰符、获取名字、获取形参、获取返回值、抛出的异常、获取注解、运行方法
获取class对象的三种方式:
1.Class.forName("全类名"),源代码阶段,全类名 = 包名 + 类名,最为常用的方法
2.类名.class,加载阶段 一般更多的是当作参数进行传递
3.对象.getClass(),运行阶段,当我们已经有了这个类的对象时才可以使用
利用反射获取构造方法:
Class类中用于获取构造方法的方法:
Constructor<?>[] getConstructors():返回所有公共构造方法对象的数组
Constructor<?>[] getDeclaredConstructors():返回所有构造方法对象的数组
Constrcutor<T> getConstructor(Class<?> ... parameterTypes):返回单个公共构造方法对象
Constructor<T> getDeclaredConstructor(Class<?> ... parameterTypes):返回单个构造方法对象
Constructor类中用于创建对象的方法
T newInstance(Object ... initargs):根据指定的构造方法创建对象
setAccessible(boolean flag):设置为true,表示取消访问检查
利用反射获取成员变量:
Class类中用于获取成员变量的方法
Field[] getFields():返回所有公共成员变量对象的数组
Field[] getDeclaredFields():返回所有成员变量对象的数组
Field getField(String name):返回单个公共成员变量对象
Field getDeclaredField(String name):返回单个成员变量对象
Field类中用于创建对象的方法
void set(Object obj,Object value):赋值
Object get(Object obj):获取值
利用反射获取成员方法:
Class类中用于获取成员方法的方法
Method[] getMethods():返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods():返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name,Class<?>... parameterTypes):返回单个公共成员方法对象
Method getDeclaredMethod(String name,Class<?>... parameterTypes):返回单个成员方法对象
Method类中用于创建对象的方法:
Object invoke(Object obj,Object...args):运行方法
参数一:用obj对象调用该方法
参数二:调用方法传递的参数
返回值:方法的返回值
反射的作用:
1.获取一个类里面的所有信息,获取之后执行其他的业务逻辑
2.结合配置文件,动态的创建对象并调用方法
动态代理:
可以无侵入式的给代码增加额外的功能,可以将所有想要被代理的方法定义在接口当中,后面的对象和代理需要实现同一个接口,接口中就是被代理的所有方法
Java.lang.reflect.Proxy类提供了为对象产生代理对象的方法:
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interface,InvocationHandler h):
参数一:用于指定用哪个类加载器去加载生成的代理类
参数二:指定接口,这些接口用于指定生成的代理长什么,也就是有哪些方法
参数三:用来指定生成的代理对象要干什么事情
new InvocationHandler{
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
参数一:代理的对象
参数二:要运行的方法
参数三:调用该方法时传递的实际参数
}
}