黑马程序员_java高级篇代理Day14(上)


                    ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------    


                                                        黑马程序员_java高级篇代理Day14(上)


#类加载器#

类加载器也是一个java,它将别的java类加载进来.

显然第一个不是java类的,我们可以将它加载进来.BootStrap

这个类的工作是啥尼,

System.out.println(System.class.getClassLoader());

输出的是null,说明加载System这个类的并不存在一个类,他其实就是我们所说的BootStrap.

Java虚拟机给我们提供了三个类加载器, BootStrap,ExtClassloader,AppClassLoader 这些类加载器是父子关系,组成树状结构.

#类加载器的委托机制#


Java虚拟机要加载一个类时,到底要派出哪个类去加载

Java虚拟机会派当前线程的类去加载第一个类

如果类A引用了类Bjava虚拟机将用加载类A的加载器去加载类B

我们也可以写代码指定某个类加载器去加载。

对于我们是否可以写一个java.lang.System,其实写了也是白写,由于加载器的机制问题

,为了让内存中只存在一份字节码,所以我们开始时问祖宗.BootStrap,你里面有这个字节码?对于我们的System,是在rt包中的,所以我们写了也不会调用。

如果你硬是要写一个,那我们自己可以写一个类加载器去加载。

#写自己的类加载器#

我们写的类加载器必须继承一个类加载器ClassLoader

我们要实现的是findclass,如:

Void findclass()

{

   LoadClass(“name”);

   DefineClass();

   

}


#一个类加载问题的高级分析#

这个要涉及到的知识,web项目中的Servlet

当我们在doget方法中加入

ClassLoader loader=this.getClass().getClassLoader();
while(loader!=null)
{
   System.out.println(loader.getClass().getName());
loader=loader.getParent();
}


我们来看看Tomcat调用的类加载器。

我们注意到Servlet1 extends HttpServlet,我们定义的Servlet继承HttpServlet,Servlet使用的类加载器是ExtClassLoader,但是我们要知道如果Servlet用ExtClassLoader加载,HttpServlet同样也用ExtClassLoader加载,当我们在ExtClassLoader的父类加载器中不能加载这个类时,我们会用ExtClassLoader,但是ExtClassLoader也不能加载,就会出错。

代理的概念与作用


通过代理,我们可以从中得到方便,Clent本来是调用Tatget的,但是当我们有了代理后,client就直接调用Proxy,代理也实现了接口中的方法,我们可以在配置文件中,直接配置是用代理还是目标

#AOP#

面向方面的编程

当我们写几个类的时候,Student类增删改查,cou类的增删改查,这里面都会涉及到安全,日志,为了解决这个问题,我们会用到代理技术。

#动态代理技术#


JVM可以在运行期间动态的生成类的字节码,这种动态生成的类往往叫做动态代理类。

但是当我们的目标方法没有实现接口,我们的代理类就不能说用接口实现所有相同的方法了

,但是出现了CGLib类可以帮我们生成一个类的子类。

我们用代理方法,可添加一些代码。

JDK中具体的动态代理类是怎么产生的呢?


1.产生代理类$Proxy0
执行了Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)

将产生$Proxy0类,它继承Proxy对象,并根据第二个参数,实现了被代理类的所有接口,自然就可以生成接口要实现的所有方法了(这时候会重写hashcodetoStringequals三个方法),但是还没有具体的实现体;
2.    将代理类$Proxy0类加载到JVM
这时候是根据Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)它的第一个参数----就是被代理类的类加载器,把当前的代理类加载到JVM
3.    创建代理类$Proxy0类的对象
调用的$Proxy0类的$Proxy0InvocationHandler)构造函数,生成$Proxy0类的对象
参数就是Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)它的第三个参数

这个参数就是我们自己实现的InvocationHandler对象,我们知道InvocationHandler对象中组合加入了代理类代理的接口类的实现类;所以,$Proxy0对象调用所有要实现的接口的方法,都会调用InvocationHandler对象的invoke()方法实现;
4.    生成代理类的class byte
动态代理生成的都是二进制class字节码


  ----------------------ASP.Net+Android+IOS开发.Net培训、期待与您交流! --------    

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值