در علوم رایانه، پژواک توانایی یک پردازه برای آزمون، خوداندیشی، و اصلاح «ساختار» و «رفتار» داخلی خودش می باشد. From Wikipedia, the free encyclopedia
در علوم رایانه، پژواک (به انگلیسی: Reflection) توانایی یک پردازه برای آزمون، خوداندیشی، و اصلاح «ساختار» و «رفتار» داخلی خودش میباشد.[1]
استفادهٔ مؤثر از پژواک، تقریباً همیشه نیاز به یک برنامه دارد: یک چهارچوب طراحی، توصیف کد دهی، کتابخانه شیی، یا تناظر یک پایگاه داده یا ارتباطات موجودیت.[2]
یک زبان پشتیبانی کننده از پژواک، ویژگیهایی را تدارک میبیند که در «زمان اجرا» استفاده میشوند، اگر این ویژگیها وجود نداشته باشد، پیادهسازی پژواک در زبانهای سطح پایین بسیار سخت است.[2]
بعضی از این ویژگیها، در ادامه ذکر میشوند، توانایی برای:
قطعه کدهایی که در ادامه میآیند یک نمونه foo از کلاس Foo را میسازند، و متد PrintHello آن را فراخوانی میکنند. برای هر زبان برنامهنویسی، ترتیب صدا زدن نرمال و مبتنی بر پژواک نشان داده شدهاست.[2]
در ادامه یک مثال به زبان سی شارپ آمدهاست:
// 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
Foo: TFoo;
begin
Foo := TFoo.Create;
try
Foo.Hello;
finally
Foo.Free;
end;
end;
procedure WithReflection;
var
RttiContext: TRttiContext;
RttiType: TRttiInstanceType;
Foo: TObject;
begin
RttiType := RttiContext.FindType('Unit1.TFoo') as TRttiInstanceType;
Foo := RttiType.GetMethod('Create').Invoke(RttiType.MetaclassType, []).AsObject;
try
RttiType.GetMethod('Hello').Invoke(Foo, []);
finally
Foo.Free;
end;
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 := Foo{}
f.Hello()
// With reflection
fT := reflect.TypeOf(Foo{})
fV := reflect.New(fT)
m := fV.MethodByName("Hello")
if m.IsValid() {
m.Call(nil)
}
در ادامه یک مثال به زبان جاوا آمدهاست:
import java.lang.reflect.Method;
// Without reflection
Foo foo = new Foo();
foo.hello();
// With reflection
try {
// Alternatively: Object foo = Foo.class.newInstance();
Object foo = Class.forName("complete.classpath.and.Foo").newInstance();
Method m = foo.getClass().getDeclaredMethod("hello", new Class<?>[0]);
m.invoke(foo);
} catch (Exception e) {
// Catching ClassNotFoundException, NoSuchMethodException
// InstantiationException, IllegalAccessException
}
در ادامه یک مثال در 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)];
در ادامه یک مثال در زبان پرل آمدهاست:
# Without reflection
my $foo = Foo->new;
$foo->hello;
# or
Foo->new->hello;
# With reflection
my $class = "Foo"
my $constructor = "new";
my $method = "hello";
my $f = $class->$constructor;
$f->$method;
# or
$class->$constructor->$method;
# with eval
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);
در ادامه یک مثال در زبان پایتون آمدهاست:
# Without reflection
obj = Foo()
obj.hello()
# With reflection
obj = globals()['Foo']()
getattr(obj, 'hello')()
# With eval
eval('Foo().hello()')
در ادامه یک مثال به زبان R آمدهاست:
# Without reflection, assuming foo() returns an S3-type object that has method "hello"
obj <- foo()
hello(obj)
# With reflection
the.class <- "foo"
the.method <- "hello"
obj <- do.call(the.class, list())
do.call(the.method, alist(obj))
در ادامه یک مثال به زبان روبی آمدهاست:
# Without reflection
obj = Foo.new
obj.hello
# With reflection
class_name = "Foo"
method_name = :hello
obj = Object.const_get(class_name).new
obj.send method_name
# With eval
eval "Foo.new.hello"
در ادامه یک مثال با استفاده از Xojo آمدهاست:
' Without reflection
Dim fooInstance As New Foo
fooInstance.PrintHello
' With reflection
Dim classInfo As Introspection.Typeinfo = GetTypeInfo(Foo)
Dim constructors() As Introspection.ConstructorInfo = classInfo.GetConstructors
Dim fooInstance As Foo = constructors(0).Invoke
Dim methods() As Introspection.MethodInfo = classInfo.GetMethods
For Each m As Introspection.MethodInfo In methods
If m.Name = "PrintHello" Then
m.Invoke(fooInstance)
End If
Next
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.