+2 امتیاز
قبل در برنامه نویسی توسط (1.1هزار امتیاز)

در زبان برنامه نویسی جاوا، Reflection چیست و چه کاربردی دارد؟

2 پاسخ

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

Reflection در برنامه های جاوا این امکان را فراهم می سازد که در زمان اجرای یک برنامه شما بتوانید بدون دانستن نام یک کلاس، interface ، فیلد یا متد آنها را فراخوانی کنید و اطلاعاتی در باره آنها کسب کنید.

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

یک مثال می زنم: برای اینکه در جاوا از یک کلاس شئ بسازید حتما باید نام آن را بدانید و آن کلاس نیز در classpath برنامه شما قرار داشته باشد و سپس با کد زیر یک شئ از آن بسازید:

MyClass obj = new MyClass();

حال می توانید متد doSomething را از این کلاس فراخوانی کنید. حالا می خواهیم یک برنامه بنویسیم که نقش یک container را دارد، بدین صورت که در زمان اجرا کلاس های مختلفی به آن داده می شود و آن برنامه باید متد doSomething آن کلاس ها را فراخوانی کند. اینجا است که Reflection بکار می آید چون در زمان کد نویسی ما نمی دانیم نام آن کلاس ها چیست و همچنین آن کلاس ها هنوز بوجود نیامده اند بنابراین در classpath برنامه نیز قرار ندارند.

برای قرار دادن یک کلاس در classpath برنامه از قابلیت Dynamic Class Loading در Reflection استفاده می کنیم و سپس با استفاده از Reflection یک شئ از کلاس های جدید در زمان اجرا می سازیم:

Constructor constructor = MyObject.class.getConstructor(String.class);
MyObject myObject = (MyObject) constructor.newInstance("constructor-arg1");

و در نهایت هم با استفاده از Reflection لیست متد های کلاس را بدست می آوریم و متد doSomething را از بین آنها پیدا کرده و فراخوانی می کنیم:

Method[] methods = MyObject.class.getMethods();

for(Method method : methods){
// condition
    System.out.println("method = " + method.getName());
}
0 امتیاز
قبل توسط (868 امتیاز)

جاوا و C# فامیلن ، فکر کنم فرقی با C# نداشته باشه ، با استفاده از REflection میتونیم از متدهای اسمبلی های مختلفو فراخوانی کنیم ، مثلا من توی برنامه C# میتونم از متدهای اسمبلی که به Java هستش استفاده کنم :) شگفت انگیزه :) ولی من استفاده نکردم ، یعنی در ان سطح که از اسمبلی زبان های دیگه استفاده کنم توی برنامم :) ولی از Reflection میشه استفاده های دیگه هم کرد ، مثلا RepositoryPattern رو در نظر بگیرین ، اونجا میتونم برای بدست اوردن تمام خصوصیات یه کلاس ، که قراره هیچ اطلاعی ازش نداشته باشم ، از همین رفلکشن استفاده میکنم نمونش کد زیر :)

    var typesToRegister = Assembly.GetExecutingAssembly().GetTypes()
            .Where(type => !String.IsNullOrEmpty(type.Namespace))
            .Where(type => type.BaseType != null && type.BaseType.IsGenericType &&
               type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
            foreach (var type in typesToRegister)
            {
                dynamic configurationInstance = Activator.CreateInstance(type);
                modelBuilder.Configurations.Add(configurationInstance);
            }

            base.OnModelCreating(modelBuilder);

 

قبل توسط (1.1هزار امتیاز)
دستتون درد نکنه جواب دادید. لزومی نداره حذف بشه. بهرحال اینم یک جواب از منظر یک C# کار.
قبل توسط (868 امتیاز)
با تشکر :)

سوالات مشابه

+1 امتیاز
1 پاسخ 1.1هزار بازدید
0 امتیاز
1 پاسخ 455 بازدید
0 امتیاز
1 پاسخ 612 بازدید
+2 امتیاز
1 پاسخ 658 بازدید
0 امتیاز
1 پاسخ 434 بازدید
...