达博中ClassLoaderFilter的作用是什么

  介绍

本篇内容介绍了“达博中ClassLoaderFilter的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

本文主要研究一下达博的ClassLoaderFilter

ClassLoaderFilter

dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ClassLoaderFilter.java

 @Activate (=group  CommonConstants.PROVIDER,, order =, -30000)
  public  class  ClassLoaderFilter  implements  Filter  {
  
  ,,@Override
  ,,,public  Result 调用(Invoker<?祝辞,调用程序,,Invocation 调用),throws  RpcException  {
  ,,,,,,,ClassLoader  ocl =, Thread.currentThread () .getContextClassLoader ();
  ,,,,,,,Thread.currentThread () .setContextClassLoader (invoker.getInterface () .getClassLoader ());
  ,,,,,,,try  {
  ,,,,,,,,,,,return  invoker.invoke(调用);
  ,,,,,,,},{finally 
  ,,,,,,,,,,,Thread.currentThread () .setContextClassLoader (ocl);
  ,,,,,,,}
  ,,,}
  
  }
<李>

ClassLoaderFilter实现了过滤器接口,其调用方法首先获取当前线程的contextClassLoader,然后将其contextClassLoader设置为invoker.getInterface () .getClassLoader(),之后执行invoker.invoke方法,最后将当前线程的类加载器重置为原来的contextClassLoader

实例

dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/测试/java/org/apache/dubbo/rpc/filter/ClassLoaderFilterTest.java

 public  class  ClassLoaderFilterTest  {
  
  ,,,private  ClassLoaderFilter  ClassLoaderFilter =, new  ClassLoaderFilter ();
  
  ,,@Test
  ,,,public  void  testInvoke (), throws  Exception  {
  ,,,,,,,URL  URL =, URL.valueOf(“测试://测试:11/测试? accesslog=true&组=dubbo&版本=1.1“);
  
  ,,,,,,,String  path =, DemoService.class.getResource (“/? .getPath ();
  ,,,,,,,final  URLClassLoader  cl =, new  URLClassLoader (new  java.net.URL [] {new  java.net.URL(“文件:“,+,路径)}),{
  ,,,,,,,,,,@Override
  ,,,,,,,,,,,public  Class<?祝辞,loadClass (String 名称),throws  ClassNotFoundException  {
  ,,,,,,,,,,,,,,,try  {
  ,,,,,,,,,,,,,,,,,,,return  findClass(名称);
  ,,,,,,,,,,,,,,,},catch  (ClassNotFoundException  e), {
  ,,,,,,,,,,,,,,,,,,,return  super.loadClass(名称);
  ,,,,,,,,,,,,,,,}
  ,,,,,,,,,,,}
  ,,,,,,,};
  ,,,,,,,final  Class<?祝辞,clazz =, cl.loadClass (DemoService.class.getCanonicalName ());
  ,,,,,,,Invoker  Invoker =, new  MyInvoker (url), {
  ,,,,,,,,,,@Override
  ,,,,,,,,,,,public  Class  getInterface (), {
  ,,,,,,,,,,,,,,,return  clazz;
  ,,,,,,,,,,,}
  
  ,,,,,,,,,,@Override
  ,,,,,,,,,,,public  Result 调用(Invocation 调用),throws  RpcException  {
  ,,,,,,,,,,,,,,,Assertions.assertEquals (cl, Thread.currentThread () .getContextClassLoader ());
  ,,,,,,,,,,,,,,,return 零;
  ,,,,,,,,,,,}
  ,,,,,,,};
  null
  null
  null
  null
  null

达博中ClassLoaderFilter的作用是什么