动态代理:动态代理就是在在程序运行时利用反射的机制来进行自动生成代理类,静态代理还需要自己来写代理类,动态代理在框架中用的比较多
格式:
Object proxyObj = Proxy.newProxyInstance(loader, interfaces, handler);
//其中loader是被代理类的构造器,interface是被代理类的接口集合,handler是想要执行的操作
InvocationHandler handler = new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //proxy是被代理类的对象,method是被代理类的方法 args是代理类的参数
//TODO
}
}
动态代理可增强对象方法的功能,例如一个ArrayList的方法可以对他进行增强,
动态代理一个共是传进去三个参数(loader是被代理类的构造器,interfaces是被代理类的接口集合,handler是想要执行的操作),在底层他们是拿到构造器和interfaces数组然后去创建.class文件给内存(注意:正常的java文件是编译后变成.class文件然后是真是存在的,但是动态代理生成的.class文件时存在在内存中的,他是看不到的,),要构造器为参数就是为了构造.class文件我的猜测,要interfaces就是为了内存中生成.class文件的时候全部都实现这些接口,毕竟是想操作被代理类,那么就要和被代理类产生联系吧,而且动态代理和静态代理其中一个条件就是必须有共同的父类。然后生成的.class文件是怎么调用invoke的:比如里面是一个list数组的list的add方法,当调用add方法的时候,就去调用handle.invoke,这也是为什么第三个参数是handler,因为他要拿到这个名字然后给内存生成.class的时候调用invoke,比如add方法
public boolean add{
handler.invoke()
}
就是类似于这种调用这也就是每次调用它的方法为什么会跑到invoke方法的原因
反射:
反射首先有三个类加载器:
1:AppClassLoader:应用类加载器 加载自定义类,比如自己创建的类
2:ExtClassLoader 扩展器类加载器 加载的是jar包中的类AppClassLoader的父类
3:Boostrap 启动类加载器 加载非自定义类类 String Integer等,ExtClassLoader 的父类 这个类加载器的父类显示的是null 其实是他再给上找父类就是c写的找不到
提到三个类加载器那么就要联想到双亲委派机制:可以理解为先去找父类加载器加载,如果父类加载器还有父类加载器那么还给上走,如果父类加载器可以加载那么就返回,如果父类加载器不能加载那么就给子类加载器,也就是说:AppClassLoader上边有父类ExtClassLoader,但是ExtLoader上边还有BoostrapLoader加载器,那么就看BoostrapLoader能不能加载如果可以加载那么就返回如果不可以加载那么就给子类ExtClassLoader如果可以加载那么返回如果不能加载那么就给子类AppClassLoader加载