直到最近,我發現Java和C#都不支持反射局部變量。例如,您無法在運行時檢索本地變量的名稱。支持完全反射的語言
雖然顯然這是一個有意義的優化,但我很好奇任何當前的語言是否支持所有聲明和構造的全面和完整的反射。
編輯:我將進一步限定我的「局部變量名稱」示例。 在C#中,您可以輸出使用的參數方法的名稱反映:
foreach(ParameterInfo pi in typeof(AClass).GetMethods()[0].GetParameters())
Trace.WriteLine(pi.Name);
你不需要知道參數的名稱(或者甚至是方法的) - 這一切都包含在反映信息。在一個完全反射的語言,你能夠做到:
foreach(LocalVariableInfo lvi in typeof(AClass).GetMethods()[0].GetLocals())
Trace.WriteLine(lvi.Name);
的應用可能是有限的(反射的許多應用程序),但儘管如此,我希望反射完整的語言來支持這樣的構建。
編輯:既然兩個人現在已經有效地說:「有一個在反映局部變量名不點」,這裏就是爲什麼它是非常有用的一個基本的例子:
void someMethod()
{
SomeObject x = SomeMethodCall();
// do lots of stuff with x
// sometime later...
if (!x.StateIsValid)
throw new SomeException(String.Format("{0} is not valid.", nameof(x));
}
當然,我可能只是硬編碼「× 「在字符串中,但正確的重構支持使得這是一個很大的禁忌。或者反映所有姓名的能力是當前缺失的一個很好的功能。
我已經改變了「確定一個局部變量的名字」來「檢索局部變量的名字」,這就是你的代碼實例所做的事情。 – Marcin 2012-03-01 13:49:22
請從一開始就看看我的視頻系列,Squeak:http://www.youtube.com/playlist?list = PL6601A198DF14788D&feature = view_all – Saijanai 2012-03-04 02:19:37