2017-08-13 4 views
1

カスタムクラスローダーを使用して、アプリケーションに必要なすべての依存関係をロードしようとしています。私はサイトの次のcustomerClassLoaderを実装しました:https://www.javacodegeeks.com/2013/03/java-handmade-classloader-isolation.htmlカスタムClassLoaderの使い方は?

しかし、私は、カスタムクラスローダーを必要に応じて使用するようにアプリケーションに指示する方法を理解していません。

たとえば、以下のようにhttpリクエストを行う方法があります。アプリケーションにカスタムクラスローダーを使用して必要なjarをロードするように指示するにはどうすればよいですか?

private HttpResponse get() { 
    HttpClient client = HttpClientBuilder.create().build(); 
    HttpGet request = new HttpGet(url); 
    HttpResponse response = client.execute(request); 
    return response; 
} 

答えて

1

あなたが使用して明示的なbootstrapクラスをロードするために、カスタムクラスローダを使用することができますので、あなたがnewを使用する場合、Javaは、importキーワードを暗黙のClassLoaderを使用しますが、JVMは、依存クラスをロードするために、現在のクラスのclasslorderを使用します。 classloader.loadclass、およびbootstrapメソッドを実行するだけで、ターゲットクラスインスタンスに属します。次の例があります。

クラスがありますTargetは、spring-contextに含まれるクラスDateFormatterに依存し、メソッドはstartとなります。

import org.springframework.format.datetime.DateFormatter; 

public class Target { 

private static DateFormatter dateFormatter; 

public void start(){ 
    System.out.println(this.getClass().getClassLoader()); 
    dateFormatter=new DateFormatter(); 
    System.out.println(dateFormatter); 
    } 
} 

次に、D:\\test\\target.jarに格納されtarget.jarという名前のJARとしてコード上にコンパイルし、パッケージ。

と次のために、我々は、URLClassLoaderインスタンスと同じclassloaderによってtarget.jarspring-context jarファイルTarget instance.The BootStarpクラス意志動的負荷の方法startを呼び出します別の瓶にBootStrapとしてクラスを宣言する必要がありますこの場合、のメソッドstartは、spring-contextで定義されるDateFormatterクラスにアクセスできます。

public class BootStrap { 


public static void main(String[] args) throws Exception{ 
    URL url = new URL("http://maven.aliyun.com/nexus/content/groups/public/org/springframework/spring-context/4.3.1.RELEASE/spring-context-4.3.1.RELEASE.jar?spm=0.0.0.0.kG1Pdw&file=spring-context-4.3.1.RELEASE.jar"); 
    URL url2= (new File("D:\\test\\target.jar").toURI().toURL()); 
    URLClassLoader classLoader = new URLClassLoader(new URL[]{url,url2}); 
    Class<?> clz = classLoader.loadClass("com.zhuyiren.Target"); 
    Object main = clz.newInstance(); 
    Method test = clz.getMethod("start"); 
    test.invoke(main); 
    } 
} 

最後に、BootStrapメインmethod.Thereを実行する二つの重要なことです:

  1. BootStrapクラスとTargetクラスが同じjarファイルに属していません。
  2. target.jarは、CLASSPATHパスに格納されていません。

これら2点をAppClassLoaderが見つからないことを確認しているため、クラスローダのメカニズム、Targetクラスをロードすることができ、カスタムを使用するJVMは、あなたが変更を通してそれを保証することができ、.OfもちろんTargetをロードURLClassLoader classLoader = new URLClassLoader(new URL[]{url,url2});URLClassLoader classLoader = new URLClassLoader(new URL[]{url, url2}, ClassLoader.getSystemClassLoader().getParent());

そして、我々は結果を見ることができた:

[email protected] 
[email protected] 
メナスは、我々は成功し spring-context jarファイルで定義されている DateFormatterインスタンスにアクセスすること

、およびspring-contextCLASSPATHに格納されていませんが、カスタムのクラスローダーを使用してロードして使用します。

0

以下が可能です。

Thread.currentThread().setContextClassLoader(new MyCustomClassLoader()); 
+0

私はまだそのルートはクラスローダに行く、これを試してみました:sun.misc.Launcher $ AppClassLoder @ – Minisha

関連する問題