मैं जावा में क्लासलोडर्स के साथ खेल रहा था और एक अजीब चीज देखी। यदि क्लासलोडर एक जार से कक्षा को लोड करता है, तो यह जार अनिश्चित काल तक बंद हो जाता है भले ही आप अपने क्लासलोडर को अपरिवर्तित करते हैं।लॉक किए गए जार के साथ जावा क्लासलोडर दुविधा
नीचे दिए गए उदाहरण में, जार में हैलोवर्ल्ड नामक एक कक्षा होती है। मैं जो करता हूं वह एक वर्ग लोडर के माध्यम से जार में निहित कक्षा को लोड करने का प्रयास करता है जो जार गतिशील रूप से जोड़ता है। यदि आप skip
से true
पर सेट करते हैं और Class.forName
पर कॉल नहीं करते हैं, तो आप जार को हटा सकते हैं, लेकिन यदि आप छोड़ नहीं पाते हैं और भले ही आप classLoader
(classLoader = null
) को अपरिवर्तित करते हैं, तो जब तक JVM बाहर निकलता है तब तक जार हटाया नहीं जा सकता है।
वह क्यों है?
पुनश्च: मैं जावा 6 उपयोग कर रहा हूँ और कोड परीक्षण प्रयोजनों
package loader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
public class TestClassLoader {
private URLClassLoader classLoader;
public TestClassLoader() throws MalformedURLException, IOException {
System.out.println("Copying jar");
if (copyJar()) {
System.out.println("Copying SUCCESS");
performFirstCheck();
} else {
System.out.println("Copying FAILED");
}
}
public static void main(String[] args) throws IOException {
System.out.println("Test started");
TestClassLoader testClassLoader = new TestClassLoader();
System.out.println("Bye!");
}
public void performFirstCheck() throws IOException {
System.out.println("Checking class HelloWorld does not exist");
if (!checkClassFound(TestClassLoader.class.getClassLoader(), false)) {
System.out.println("Deleting jar");
deleteJar();
System.out.println("First Check SUCCESS");
performSecondCheck();
} else {
System.out.println("First Check FAILED");
}
}
private void performSecondCheck() throws IOException {
System.out.println("Copying jar");
if (copyJar()) {
System.out.println("Copying SUCCESS");
createClassLoaderAndCheck();
} else {
System.out.println("Copying FAILED");
}
}
private void createClassLoaderAndCheck() throws MalformedURLException {
System.out.println("Creating classLoader");
createClassLoader();
System.out.println("Checking class HelloWorld exist");
if (checkClassFound(classLoader, true)) {
System.out.println("Second Check SUCCESS");
classLoader = null;
System.out.println("Deleting jar");
if (deleteJar()) {
System.out.println("Deleting SUCCESS");
} else {
System.out.println("Deleting FAILED");
}
} else {
System.out.println("Second Check FAILED");
}
}
public void createClassLoader() throws MalformedURLException {
URL[] urls = new URL[1];
File classFile = new File("C:\\Users\\Adel\\Desktop\\classes.jar");
urls[0] = classFile.toURI().toURL();
classLoader = new URLClassLoader(urls);
}
public boolean checkClassFound(ClassLoader classLoader, boolean skip) {
if (skip) {
System.out.println("Skiping class loading");
return true;
} else {
try {
Class.forName("HelloWorld", true, classLoader);
return true;
} catch (ClassNotFoundException e) {
return false;
}
}
}
public URLClassLoader getClassLoader() {
return classLoader;
}
public boolean copyJar() throws IOException {
File sourceJar = new File("C:\\Users\\Adel\\Desktop\\Folder\\classes.jar");
File destJar = new File("C:\\Users\\Adel\\Desktop\\classes.jar");
if (destJar.exists()) {
return false;
} else {
FileInputStream finput = new FileInputStream(sourceJar);
FileOutputStream foutput = new FileOutputStream(destJar);
byte[] buf = new byte[1024];
int len;
while ((len = finput.read(buf)) > 0) {
foutput.write(buf, 0, len);
}
finput.close();
foutput.close();
return true;
}
}
public boolean deleteJar() {
File destJar = new File("C:\\Users\\Adel\\Desktop\\classes.jar");
return destJar.delete();
}
}
पर उपलब्ध कराएगा, क्या आप एक कामकाज या व्याख्या चाहते हैं ? – esej
@esej मुझे पहले से ही दोनों मिले हैं, मेरा जवाब जांचने और आपको राय साझा करने की परवाह है? –