0 امتیاز
قبل در برنامه نویسی توسط (505 امتیاز)
ویرایش شده قبل توسط

من یک فایل jar دانلود کردم و باید ابتدا این فایل jar را در برنامه Load کنم و بعد از آن یکی از فایل هایش با پسوند .class را لود کنم.برای لود کلاس طبق لینک زیر مشکلم حل می شود:(البته من کد زیر را در حالتی تست کردم که فایل jar را قبلا به صورت دستی به برنامه اضافه کرده بودم ،نه از راه کدنویسی)

چطور در جاوا می توان فایل با پسوند class را در زمان runtime در برنامه بارگذاری کرد؟

الان چند تا مشکل دارم:

1-من این فایل jar را که دانلود کردم ،نمی دونم داخل هر فایل class. اش چه متدهایی وجود داره،که بخوام اونارو فراخوانی کنم.

با توجه به این مورد،به چه شکل می تونم متدهایی را که نمیدونم چی هستند را فراخونی کنم؟(در واقع آیا راهی هست که اطلاعاتی درباره ی این کلاس و متدهاش داشته باشم؟)

2-من کدزیر را پیدا کردم ولی فایل jar را پیدا میکنه ولی موقع لود کلاساش،خطا می دهد که "Source not found".این پیغام را موقع debug می دهد ،آخرشم این خطا را میدهد:

Exception in thread "main" java.lang.NoClassDefFoundError: antlr/CommonAST
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(Unknown Source)
	at java.security.SecureClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.defineClass(Unknown Source)
	at java.net.URLClassLoader.access$100(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.net.FactoryURLClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at fileFolder.Actions.DynamicClassLOading(Actions.java:94)
	at fileFolder.Exec.main(Exec.java:35)
Caused by: java.lang.ClassNotFoundException: antlr.CommonAST
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 16 more

 

 

اینم کد من:

public void DynamicClassLOading() throws IOException,
			ClassNotFoundException {

		String pathToJar = "E:\\hibernate-core-4.1.0.Final.jar";
		JarFile jarFile = new JarFile(pathToJar);
		Enumeration e = jarFile.entries();

		URL[] urls = { new URL("jar:file:" + pathToJar + "!/") };
		URLClassLoader cl = URLClassLoader.newInstance(urls);

		while (e.hasMoreElements()) {
			JarEntry je = (JarEntry) e.nextElement();
			if (je.isDirectory() || !je.getName().endsWith(".class")) {
				continue;
			}
			// -6 because of .class
			String className = je.getName().substring(0,
					je.getName().length() - 6);
			className = className.replace('/', '.');
			Class c = cl.loadClass(className);

		}

	}

1 پاسخ

0 امتیاز
قبل توسط (1.1هزار امتیاز)

اگر فرض کنیم در فایل jar با نام java-test.jar یک کلاس با نام NewClass وجود دارد:

public class NewClass {
    public String echo(String text){
        return "echo -> "+text;
    }
}

حالا می خواهیم متد echo را با استفاده از ClassLoader بصورت داینامیک لود کرده و فراخوانی کنیم:

    public static void main(String[] args) throws MalformedURLException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
        File file = new File("/home/saeed/NetBeansProjects/java-test/dist/java-test.jar");

        URI uri = file.toURI();
        URL[] urls = new URL[]{uri.toURL()};

        ClassLoader classLoader = new URLClassLoader(urls);

        Class clazz = classLoader.loadClass("com.test.NewClass");

        Object obj = clazz.newInstance();

        System.out.println("" + obj.getClass().
                getMethod("echo", String.class).invoke(obj, "Saeed"));
    }

سوالات مشابه

0 امتیاز
1 پاسخ 433 بازدید
0 امتیاز
2 پاسخ 723 بازدید
+1 امتیاز
1 پاسخ 1.3هزار بازدید
0 امتیاز
1 پاسخ 502 بازدید
0 امتیاز
1 پاسخ 1.2هزار بازدید
0 امتیاز
0 پاسخ 1.2هزار بازدید
+1 امتیاز
1 پاسخ 325 بازدید
سوال شده 9 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 2.4هزار بازدید
...