反射,注解,动态代理

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值