برنامه‌نویسی پژواکی
در علوم رایانه، پژواک توانایی یک پردازه برای آزمون، ، و اصلاح «ساختار» و «رفتار» داخلی خودش می‌باشد.استفادهٔ مؤثر از پژواک، تقریباً همیشه نیاز به یک برنامه دارد: یک چهارچوب طراحی، توصیف کد دهی، کتابخانه شیی، یا تناظر یک پایگاه داده یا ارتباطات موجودیت.
یک زبان پشتیبانی کننده از پژواک، ویژگی‌هایی را تدارک می‌بیند که در «زمان اجرا» استفاده می‌شوند، اگر این ویژگی‌ها وجود نداشته باشد، پیاده‌سازی پژواک در زبان‌های سطح پایین بسیار سخت است.
بعضی از این ویژگی‌ها، در ادامه ذکر می‌شوند، توانایی برای:
قطعه کدهایی که در ادامه می‌آیند یک نمونه foo از کلاس Foo را می‌سازند، و متد PrintHello آن را فراخوانی می‌کنند. برای هر زبان برنامه‌نویسی، ترتیب صدا زدن نرمال و مبتنی بر پژواک نشان داده شده‌است.
در ادامه یک مثال به زبان سی شارپ آمده‌است: // Without reflection Foo foo = new Foo(); foo.PrintHello();
// With reflection Object foo = Activator.CreateInstance("complete.classpath.and.Foo"); MethodInfo method = foo.GetType().GetMethod("PrintHello"); method.Invoke(foo, null); این مثال دلفی فرض کرده‌است که یک کلاس TFoo در یک واحد که Unit1 نام دارد، اعلام شده‌است: uses RTTI, Unit1;
procedure WithoutReflection; var begin end;
procedure WithReflection; var begin end; در ادامه یک مثال در زبان eC آمده‌است: // Without reflection Foo foo { }; foo.hello();
// With reflection Class fooClass = eSystem_FindClass(__thisModule, "Foo"); Instance foo = eInstance_New(fooClass); Method m = eClass_FindMethod(fooClass, "hello", fooClass.module); ((void (*)())(void *)m.function)(foo); در ادامه یک مثال یه زبان ECMAScript آمده‌است، و بنابراین به JavaScript و ActionScript اعمال می‌شود: // Without reflection new Foo().hello()
// With reflection
// assuming that Foo resides in this new this['Foo']()['hello']()
// or without assumption new (eval('Foo'))()['hello']()
// or simply eval('new Foo().hello()')
// Using ECMAScript 2015's new Reflect class: Reflect.construct(Foo, [])['hello']() در ادامه یک مثال به زبان Go آمده‌است: import "reflect"
// Without reflection f.Hello()
// With reflection fT := reflect.TypeOf(Foo{}) fV := reflect.New(fT)
m := fV.MethodByName("Hello") if m.IsValid() {
در ادامه یک مثال به زبان جاوا آمده‌است: import java.lang.reflect.Method;
// Without reflection Foo foo = new Foo(); foo.hello();
// With reflection try {
} catch (Exception e) {
در ادامه یک مثال در Objective-C آمده‌است، و معنی ضمنی می‌دهد که یا چهارچوب OpenStep یا Foundation Kit استفاده شده‌است: // Foo class. @interface Foo : NSObject - (void)hello; @end
// Sending "hello" to a Foo instance without reflection. Foo *obj = [[Foo alloc] init]; [obj hello];
// Sending "hello" to a Foo instance with reflection. id obj = [[NSClassFromString(@"Foo") alloc] init]; [obj performSelector: @selector(hello)]; در ادامه یک مثال در زبان پرل آمده‌است: my $foo = Foo->new; $foo->hello; Foo->new->hello; my $class = "Foo" my $constructor = "new"; my $method = "hello";
my $f = $class->$constructor; $f->$method; $class->$constructor->$method; eval "new Foo->hello;"; در ادامه یک مثال به زبان PHP آمده‌است: // Without reflection $foo = new Foo(); $foo->hello();
// With reflection, using Reflections API $reflector = new ReflectionClass('Foo'); $foo = $reflector->newInstance(); $hello = $reflector->getMethod('hello'); $hello->invoke($foo); در ادامه یک مثال در زبان پایتون آمده‌است: obj = Foo() obj.hello() obj = globals()['Foo']() getattr(obj, 'hello')() eval('Foo().hello()') در ادامه یک مثال به زبان R آمده‌است: obj