あなたが使用して明示的な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.jar
とspring-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を実行する二つの重要なことです:
BootStrap
クラスとTarget
クラスが同じjarファイルに属していません。
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-context
はCLASSPATH
に格納されていませんが、カスタムのクラスローダーを使用してロードして使用します。
私はまだそのルートはクラスローダに行く、これを試してみました:sun.misc.Launcher $ AppClassLoder @ – Minisha