یک ClassLoader سفارشی در جاوا بنویسید که یک فایل .class را از پوشه مشخصی در دیسک بارگذاری کند و سپس با استفاده از Reflection یک متد بدون پارامتر از آن کلاس را اجرا کند.
2.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:08 0.0
برای حل این مسئله یک کلاس جدید از java.lang.ClassLoader بسازید و متد findClass یا loadClass را اورراید کنید؛ سپس با خواندن بایتهای فایل .class (مثلاً با java.nio.file.Files.readAllBytes یا InputStream) از defineClass برای تبدیل بایتها به یک Class استفاده کنید. پس از بارگذاری کلاس، با استفاده از Class.forName یا loader.loadClass، نمونهای از کلاس تولید کرده و با java.lang.reflect.Method متد مورد نظر را (در صورت نیاز با setAccessible(true)) گرفته و با invoke اجرا کنید. نکات: از try-with-resources برای بستن جریانها استفاده کنید، استثناها را مدیریت کنید و در صورت نیاز به بارگذاری از مسیرهای دینامیک میتوانید از URLClassLoader هم بهره ببرید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
نکته مهم این است که برای یک ClassLoader سفارشی، از مدل Delegation درست استفاده کنید تا با کلاسهای موجود JVM تداخلی ایجاد نشود. برای بارگذاری از دیسک، بایتها را با readAllBytes یا InputStream بخوانید و از defineClass استفاده کنید و مطمئن شوید که نام پکیج و کلاس دقیق است. برای فراخوانی یک متد بدون پارامتر با Reflection، متد را با getDeclaredMethod پیدا کنید و در صورت نیاز setAccessible(true) انجام دهید و سپس invoke کنید. استفاده از try-with-resources و مدیریت استثناها و در صورت نیاز استفاده از URLClassLoader برای مسیرهای دینامیک نکتههای خوبی هستند.
گزارش