ورود

View Full Version : کاربرد استفاده از Reflection



rahimi.mohamad24
یک شنبه 09 تیر 1392, 21:44 عصر
سلام
کاربرد استفاده از Reflection در برنامه های جاوا چیست؟
در چه نمونه هایی از آت استفاده کتیم؟اگر یک نمونه کد بگذارید ممنون میشم

spiderman200700
دوشنبه 10 تیر 1392, 16:30 عصر
http://docs.oracle.com/javase/tutorial/reflect

import java.lang.reflect.Method;
public class Main {
public static void main(String[] args){
String func = "test";
Object arguments[] = {"this is ", "really cool"};
try{
Class cl = Class.forName("Main");
for (Method method : cl.getMethods()){
if(method.getName().equals(func)){
method.invoke(null, arguments);
}
}
} catch (Exception ioe){
System.out.println(ioe);
}
}
public static void test(String s, String b){
System.out.println(s+b);
}
}

cups_of_java
دوشنبه 10 تیر 1392, 20:05 عصر
مال وقتیه که شما نیاز داشته باشی اطلاعاتی راجع به کلاس ها، ساختار درونیشون، متد های اون ها و ... داشته باشین تو برنامتون.
همینطور مال وقتی که مثلن بخواین یه متدی که اسمش در زمان اجرا معلوم میشه رو فراخوانی کنید.
از رفلکشن در پیاده سازی خیلی از فریمورک ها و اپلیکیشن سرور ها استفاده شده.

rahimi.mohamad24
دوشنبه 10 تیر 1392, 21:53 عصر
همینطور مال وقتی که مثلن بخواین یه متدی که اسمش در زمان اجرا معلوم میشه رو فراخوانی کنید.

میشه لطفا مثال کاربردی و عملیشو بگویید،مثلا خودتان در چه پروژه ای استفاده کردید؟

DigitalRain
سه شنبه 11 تیر 1392, 11:19 صبح
متدی که در زمان اجرا اسمش مشخص می‌شه؟ این متد‌ّا رو هم با رفلکشن ایجاد می‌کنن؟

DigitalRain
سه شنبه 11 تیر 1392, 11:39 صبح
میشه لطفا مثال کاربردی و عملیشو بگویید،مثلا خودتان در چه پروژه ای استفاده کردید؟

مثلا در ساخت AutoComplete ها می‌شه ازش استفاده کرد (البته در این مورد راه بهتری هست که از اون استفاده می‌شه)

مثالی که من ازش استفاده‌ی محدودی داشتم توی یه بازی استراتژیک بود. مثلا در بخش ساخت ساختمان ها وقتی می‌خواستم به متد buildNewBuilding نوع ساختمونی رو که می‌خوام بسازم رو پاس بدم بجای اینکه از یه String یا Enum استفاده کنم و بهش مثلا "Farm" یا BuildingTypes.FARM رو پاس بدم٬ Class(دقت کنید با C بزگ!) کلاس Farm رو می‌دادم به این شکل:

gameState.builNewBuilding(Farm.class, location ...


مزیتش: نسبت به String: در مصرف حافظه و احتمال ایجاد خطا به دلیل اشکال تایپی صرفه جویی می‌کنه٬ نسبت به Enum (که مشکل حافظه و غلط تایپی رو حل کرده): اولا لازم نیست Enum مربوطه import بشه و زمان Load فایل .class رو اندکی کاهش می‌ده٬ من داخل کلاس Farm فیلد هایی دارم(بهتره بگم در پدر Farm در حقیقت کل مشتقات Building) که سایز و زمان موردنیاز برای ساخت و... رو ذخیره می‌کرد٬ اگر می‌خواستم از String و Enum استفاده کنم باید if-else یا switch می‌زاشتم و بسته به ورودی این پارامتر‌ها رو خارج می‌کردم شبیه این کد:

switch(buildingType) {
case BuildingType.FARM:
ETA = Farm.ETA;
size = Farm.size;
break;
case GoldMine:
ETA = GoldMine.ETA;
.
.
.


اما حالا با Reflection از رفرنس از جنس Class ای که به تابع پاس شده لیست فیلد‌های استاتیک رو می‌گیرم و مقدار ETA و Size یا هر پارامتر دیگه ای که لازم باشه رو می‌گیرم٬ switch یا if-else هایی که چندین جای برنامه تکرار می‌شد برای منظور‌های مختلف مثل همین مشخص کردن نوع ساختمانی که باید ساخته شه یا نوع شهروند(کارگز-سرباز-...) و... همه با دو خط کد Reflection جایگزین شدن که غیر از اینکه کار برنامه نویسی رو کم می‌کنه گسترش کد رو خیلی راحت می‌کنه. فرض کنید من بخوام یک نوع جدید ساختمون اضافه کنم٬ فقط کافیه یه کلاس جدید از Building مشتق بگیرم و پارامتر‌هاشو ست کنم٬ دیگه لازم نیست برم تو تمام if-else ها و switch ها یه case جدید اضافه کنم.

کاربرد دیگه ای که سر کلاس AP استاد می‌گفت وقتیه که شما دسترسی مستقیم به کلاس نداری اما باید یه کارایی روش انجام بدی٬ مثلا از راه دور تو شبکه از یه کلاس یه اینستنس بگیرین چند تا متد رو صدا بزنین خروجیش رو بگیرین و...

کاربرد دیگه ای که مطمئن نیستم و فقط حدس می‌زنم Debugger ها هستن٬ مثلا شما Eclipse رو می‌بینین که از دیباگر خود جاوا استفاده می‌کنه و برای دیدن مقدار یه متغیر زمان دیباگ محدودیت‌هایی دارین مثل اینکه حتما باید به بریک پوینت برسین٬ هر متغیری رو هم نمی‌شه دید فقط اونایی که تو اون برک پوینت دارن تغییر می‌کنن برای متغیر‌های دیگه باید watch بزارین٬ اما دیباگر NetBeans دسترسی خیلی بیشتری به شما می‌ده هر زمانی هر متغیری رو خواستین می‌تونین ببینین و مقدارشو تغییر بدین که فکر می‌کنم با Reflection دسترسی متغیر‌ها رو موقتا برای خودش public می‌کنه و مقدارشونو هم می‌تونه ببینه هم تغییر بده و محدودیتی به بریک پوینت یا watch گداشتن نداره

cups_of_java
سه شنبه 11 تیر 1392, 19:36 عصر
میشه لطفا مثال کاربردی و عملیشو بگویید،مثلا خودتان در چه پروژه ای استفاده کردید؟

فرض کن کلاس MyClassی وجود داره که میخوایم یه سری از متد هاشو که ورودی یک int میگیرن رو صدا کنیم. کاربر در حین اجرای برنامه نام و ترتیب اجرا شدن این متد ها رو معین می کنه!
MyClass obj = new MyClass();
methodNames = read_method_name_from_somewhere...;
for(String methodName : methodNames) {
Method method = Class.forName("MyClass").getMethod(methodName, new Class[] {int.class});
method.invoke(obj, 4); // 4 is the argument to pass to the method
}

حالا این مثال به کنار، از این تکنیک ها شما در
نوشتن سیستم های پلاگین بیس
نوشتن موتورهای Workflow
نوشتن برنامه های به سبک AOP
آنالیز کردن ساختار استاتیک کلاس ها در زمان اجرا
Dependency INjection
و...
می تونین استفاده کنید.

cups_of_java
سه شنبه 11 تیر 1392, 19:38 عصر
متدی که در زمان اجرا اسمش مشخص می‌شه؟ این متد‌ّا رو هم با رفلکشن ایجاد می‌کنن؟

با Reflection چیزی رو نمیشه تغییر داد یا ایجاد کرد، بلکه فقط میشه ساختار کلاس رو خوند و استفاده کرد.

ضمنن تا جایی که من یادمه سطوح دسترسی هم در Reflection رعایت میشه اگه اشتباه نکنم، شما نمی تونی متدی که private هست رو فراخوانی کنی مثلن!
توجه کنید که بحث Debuggerها خیلی فراتر از Reflection در زبان های برنامه نویسی هستش.

DigitalRain
پنج شنبه 13 تیر 1392, 00:09 صبح
ضمنن تا جایی که من یادمه سطوح دسترسی هم در Reflection رعایت میشه اگه اشتباه نکنم، شما نمی تونی متدی که private هست رو فراخوانی کنی مثلن!
SecurityException می‌ده فکر کنم. اما می‌شه موقتا private رو public کرد دیگه؟
سوال امتحان AP مون تو ترم دو این بود که مقدار فیلد SecretCode رو با رفلکشن پیدا کنید (طبیعتا فقط فایل .class رو داشتیم و به سورس دسترسی نداشتیم اما می‌دونستیم همچین فیلدی وجود داره)


public final class MyCLass {
private final String SecretCode;
.
.
.
}

a.seieddokht
پنج شنبه 13 تیر 1392, 16:47 عصر
SecurityException می‌ده فکر کنم. اما می‌شه موقتا private رو public کرد دیگه؟
سوال امتحان AP مون تو ترم دو این بود که مقدار فیلد SecretCode رو با رفلکشن پیدا کنید (طبیعتا فقط فایل .class رو داشتیم و به سورس دسترسی نداشتیم اما می‌دونستیم همچین فیلدی وجود داره)


public final class MyCLass {
private final String SecretCode;
.
.
.
}


با سلام دوست خوب یکی از کاربرد های Reflection این که شما متونید مثلا متد های private کلاس بیرون از کلاس call کنی این که دوستمون میگه نمیشه این کارو کرد من میگم میشه چون اصلا Reflection یعنی دور زدن کامپایلر و من این کارو کردم من خودم مبتدی هستم خیلی خیلی موفق باشی

cups_of_java
پنج شنبه 13 تیر 1392, 21:50 عصر
حق با شماست این کار شدنیه: http://stackoverflow.com/questions/880365/any-way-to-invoke-a-private-method