코딩 개념 - 반영

반사 - 당신이 알아야 할 것.



In computer science, reflection is the ability of a computer program to examine, introspect, and modify its own structure and behavior at runtime.[1]


그래서 그게 무슨 뜻이야? 성찰은 때때로 사용되는 용어인데 그것이 무엇을 의미하는지 정말로 알고 있습니까? 왜, 언제 사용해야 하며, 주요 강점은 무엇입니까? 이것은 이해하기 꽤 어려운 개념이지만, 겉보기에 불가능해 보이는 특정 작업을 가능하게 만들 수 있으므로 배우기 위해 노력할 가치가 충분히 있습니다.

보통 저는 대부분의 사람들이 이해할 수 있도록 자바스크립트로 예제를 실행하지만 자바스크립트 리플렉션은 자바 및 C#과 같은 사전 컴파일된 객체 지향 언어와 실제로 동일하지 않습니다. 클래스 자체가 포함되어 있지 않기 때문입니다. 오늘의 예를 사용하십시오. .Net Framework 및 CLR(Common Language Runtime)은 Visual Studio 내의 Intellisense 및 기타 IDE 기능과 같은 기능과 직렬화에 대해 리플렉션을 많이 사용하므로 아마도 리플렉션에 대해 알지 못하는 사이에 리플렉션을 사용하게 될 것입니다.

C#에서 이 예제를 살펴보겠습니다.

// Using GetType to obtain type information:  
int i = 42;  
System.Type type = i.GetType();  
System.Console.WriteLine(type);


짐작하셨겠지만 콘솔의 출력은 다음과 같습니다.
System.Int32

So this static method GetType uses reflection to obtain the type of the variable! Obviously when writing the code we know that "i" is an Integer but the runtime doesn't have this knowledge to hand, so it must search within itself to figure it out! Most people will have used GetType in the past, but some may have not known how it obtains the type!

Let's look at the main uses of Reflection and answer some of the questions raised above, I'll try and keep it easy to follow.

리플렉션을 사용하는 시기와 이유!

  • Traditionally used to load modules/classes from assembly and create an instance of them, at runtime.
  • For getting an Object's Public Attributes.
  • During testing, creating mock objects during runtime initialisation.
  • To create Generic libraries to handle different formats without redeployments, sometimes referred to, or using Implicit Late Binding.
  • When building new types at runtime.
  • For examining and instantiating types in an assembly.
  • The ability to change the value of a field marked private in a 3rd party library.
The ability to inspect the code in the system and see object types is not reflection, but rather Type Introspection. Reflection is then the ability to make modifications at runtime by making use of introspection. The distinction is necessary here as some languages support introspection, but do not support reflection. One such example is C++

So as you can see it's mainly about classes, looking at them, changing them, instantiating them, but all at runtime rather than compile time!

The best way I can explain the difference between the two is by looking at your running shoes!

Compile time is like doing up your shoe laces and checking them before you go out for a run. Whatever you do to your shoes will be saved and kept. This will give you an insight whether anything is wrong with them, and what they contain and can do.

Runtime is when you're already out on the road! Your shoes have already been prepared for you, you can't usually change those shoes or retie those laces unless you stop, but you can see what the shoes are capable of, and use any existing features that these shoes have available! You could switch shoes by jumping into a new set, but this requires the new set of shoes to be already created too and available to you on the run.

In object-oriented programming languages, reflection allows inspection of classes, interfaces, fields and methods at runtime without knowing the names of the interfaces, fields, methods at compile time. It also allows instantiation of new objects and invocation of methods.

So above we had an example of using reflection on an object and getting the object attributes, now lets looks at using reflection to get info from a Type, and how we'd find and load new assemblies during runtime.

        // Using Reflection to get information from an Assembly:  
        System.Reflection.Assembly integerTypeAssembly = typeof(System.Int32).Assembly;  
        System.Type integerType = typeof(System.Int32);

        System.Console.WriteLine(integerTypeAssembly); // mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
        System.Console.WriteLine(integerType.ToString()); // System.Int32

        //Use this typeString to refind the type
        Type calcType = integerTypeAssembly.GetType(integerType.ToString());
        System.Console.WriteLine(calcType); // System.Int32

        // We can then Create a new Instance of whatever this type may be, and call it's methods.
        object integerInstance = Activator.CreateInstance(calcType); 
        // In this case it's just a boring Integer, and we can see it's been initialised to it's default of 0..
        System.Console.WriteLine(integerInstance.ToString());


컴파일 중에 설정된 변수를 살펴보고 라이브러리 자체를 쿼리하는 것의 미묘한 차이와 이 두 가지 유형의 리플렉션을 사용하여 런타임 중에 시스템을 변경할 수 있는 다른 방법을 볼 수 있습니다.

실제 사례



리플렉션을 사용하는 유용한 실제 사례는 데이터베이스 또는 기타 정적 리소스에 저장된 값을 기반으로 어셈블리 간에 전환하는 것입니다. 예: 시스템에 "GoogleSearchService"및 "BingSearchService"가 구성되어 있습니다. 일반적으로 이러한 서비스 중 하나를 사용할 서비스로 하드 코딩/주입합니다.

그러나 예를 들어 런타임에 사용되는 데이터베이스에서 서비스를 검색하는 "LoadSearchServiceAssemblyFromResource()"메서드가 있다고 가정해 보겠습니다.

이 서비스가 중단되거나 더 이상 사용되지 않거나 계약이 종료되는 경우 "BingSearchService"를 사용하여 시스템을 재배포하지 않고 다른 어셈블리("BingSearchServiceAssembly")를 가리키는 데이터베이스/스토리지 필드를 업데이트하기만 하면 됩니다. .

다음에 검색 서비스가 호출되면 런타임에 새 서비스로 동적으로 전환됩니다. 저에게는 이것이 리플렉션의 주요 이점이자 리플렉션을 사용할 수 있거나 사용해야 하는 이유입니다. 각 서비스는 dll이므로 이와 같은 형식을 사용하여 리플렉션을 사용하여 직접 호출할 수 있습니다.

//This will load the dll from a static resource such as a DB or File
Assembly searchAssembly = LoadSearchServiceAssemblyFromResource();
// Now we need to find the class in the assembly, this in this instance is simply called "Search"
Type searchType = searchAssembly.GetType(searchAssembly.GetName().Name + "Search");

// If we have found the class
if (searchType != null)
{
    object searchResult = null;
    dynamic classInstance = Activator.CreateInstance(searchType);
    // DoSearch is a method that is declared on both SearchService Classes!
    var searchResult = instance.DoSearch();
}


이를 사용할 시나리오가 항상 있는 것은 아니지만 언제, 왜 사용해야 하는지 아는 것은 매우 중요합니다.

여기에서 다루지 않은 Reflection에는 더 많은 부하가 있습니다. 따라서 해당 주제에 대해 더 자세히 알고 싶다면 추가 자료를 살펴보십시오.


추가 읽기



Microsoft Concept Docs - Reflection

Type Introspection and Reflection

Microsoft - Reflections and CodeDom

Microsoft Reflection - Dynamically Loading and Using Types

StackOverflow - What is reflection and why is it useful

좋은 웹페이지 즐겨찾기