反射,注解,动态代理

反射,注解,动态代理,第1张

动态代理:动态代理就是在在程序运行时利用反射的机制来进行自动生成代理类,静态代理还需要自己来写代理类,动态代理在框架中用的比较多
   格式:

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加载
                           

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/724024.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存