문제

정확히 무엇입니까?나는 디 이 주제에 대한 기사와 이해의 종류 메타-프로그래밍,프로그램을 수정할 수 있습 자체가 실행 시,하지만 이것은 무엇을 의미합니까?에서 어떤 종류의 상황은 이 좋은 방법을 때는 그것이 최선을 사용합니까?

도움이 되었습니까?

해결책

반사 시설입 쿼리할 수 있는 객체에 대한 그 속성을 수 있습니다.예를 들어,Python,Java.Net 있는 시설이 당신을 찾을 수 있습니다 인스턴스 또는 변수의 방법입니다.

예를 들어의 응용 프로그램에 대한 반영이 O/R 레이어입니다.일부 사용을 반영하여 구성하여 개체 quering 의 속성에서 런타임과 동적으로 채우는 인스턴스입니다.이 사용하여 이 작업을 수행할 수 있습 프로그래밍 기반 메타데이터에서는 어떤 종류의 데이터전지 않고 다시 컴파일할 필요합니다.

을,간단한 예제를 사용하는 파이썬기 때문에 그 반사 시설로는 사용이 매우 간단하고 적은 상용구의 그들 보다는 자바나.Net.

ActivePython 2.5.2.2 (ActiveState Software Inc.) based on
Python 2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> class foo:
...     def __init__(self):
...             self.x = 1
...
>>> xx = foo()      # Creates an object and runs the constructor
>>> xx.__dict__     # System metadata about the object
{'x': 1}
>>> a = xx.__dict__ # Now we manipulate the object through 
>>> a['y'] = 2      # its metadata ...
>>> print xx.y      # ... and suddenly it has a new instance variable
2                   
>>>

이제 우리가 사용하는 기본적인 반사하는 검사 인스턴스의 변수 임의의 개체입니다.특별한 변수 __dict__ 파이썬은 시스템 객체의 속성이 있는 해시 테이블의 구성원에 의해 키 변수(또는 방법)이름입니다.우리는 사려깊게 조사합체고 사용하는 반사 시설 인위적으로 찌르 두 번째 인스턴스는 변수로는,그것을 우리는 다음 표시를 호출하여 그것은으로 인스턴스는 변수입니다.

이는 특정 속에서 작동하지 않 Java 또는.Net,으로 인스턴스의 변수는 고정되어 있습니다.유형 시스템의 이러한 언어를 허용하지 않는 새 인스턴스는 변수에 추가 런타임이 길에서는 파이썬의'오리'타이핑 시스템 않습니다.그러나,당신이 할 수 있는 사려깊게 업데이트 값 인스턴스의 변수를 선언한 유형에서 정의합니다.

할 수도 있습니다 리플렉션을 사용하여 동적으로 생성 메소드 호출을 수행하는 다양한 기타 깔끔한 트릭 등의 인스턴스화에 기초하여 개체 매개 변수입니다.예를 들어,당신은 어떤 종류의 플러그인을 기반으로 시스템이 특정 기능 선택 사용할 수 있습니 반사를 쿼리하는 플러그인에 대한 어떤 서비스를 제시(아마도를 쿼리하여 여부는 특정 인터페이스가 구현되었)필요로하지 않고 명시적인 메타데이터가 포함되어 있습니다.

많은 동적 언어와 같은 인터페이스 OLE 자동화 사용하여 반영으로 필수적인 부분의 인터페이스입니다.

다른 팁

그리 많지 않습니다 수정 실행 시간에 코드이지만 객체를 검사하고 자신의 유형을 정적으로 모르고 코드를 실행하도록 요청합니다.

그것을 설명하는 간단한 방법 중 하나는 "정적으로 입력 된 언어를 동적으로 행동하게 만드는 다소 고통스러운 방법"입니다.

편집 : 사용 :

  • 구성 (예 : 유형 및 속성을 지정하는 XML 파일을 가져간 다음 적절한 개체를 구성)
  • 테스트 (이름 또는 속성으로 식별되는 단위 테스트)
  • 웹 서비스 (적어도 .NET에서는 핵심 웹 서비스 엔진에서 많은 반사가 사용됩니다)
  • 자동 이벤트 배선 - 적절한 이름을 가진 방법을 제공합니다 (예 : SubmitButton_Click ASP.NET은 해당 메소드를 핸들러로 첨부합니다. SubmitButton'에스 Click 이벤트 (Autowiring이 켜진 경우)

좋은 생각인가요? 글쎄, 대안이 고통 스러울 때만. 나는 방해가되지 않을 때 정적 타이핑을 선호합니다. 그러면 컴파일 타임 장점이 많고 더 빠릅니다. 하지만 당신이 하다 반사를 통해 불가능한 다양한 일을 할 수 있습니다.

내 머리 꼭대기에서 생각할 수있는 첫 번째 좋은 예는 컴파일 타임에 어떤 메소드에 존재하는지 모르면 주어진 객체에서 메소드 세트를 실행해야 할 때입니다.

예를 들어 단위 테스트 프레임 워크를 사용하십시오. 모든 단위 테스트를 실행할 책임이있는 테스트 러너 클래스는 방법의 이름을 미리 알 수 없습니다. 아는 것은 그들이 "테스트"(또는 Java 5의 경우 주석이 달린 Java 5의 경우에 접두사 될 것입니다. @Test). 따라서 테스트 클래스가 주어지면 모든 방법의 목록을 얻기 위해 해당 클래스를 반영합니다. 그런 다음 해당 메소드 이름을 문자열로 반복하고 "테스트"로 시작하면 객체에서 해당 메소드를 호출합니다. 반사 없이는 불가능합니다. 그리고 그것은 단지 하나의 예입니다.

반사는 내가 생각할 수있는 최소 1 개의 프로젝트에서 나에게 유용했다. 우리는 특정 간격으로 많은 주요 비즈니스 프로세스를 수행하는 내부 "프로세스 관리자"프로그램을 작성했습니다. 이 프로젝트는 코어가 실제로 30 초마다 발사되는 타이머 개체가있는 Windows 서비스 일 뿐이도록 설정되어 작업 할 작업을 확인합니다.

실제 작업은 클래스 라이브러리 ( "WorkerLib")에서 수행되고 있습니다. 특정 작업 (파일 이동, 원격 사이트에 데이터 업로드 등)을 수행하는 공개 메소드가있는 클래스를 정의합니다. 핵심 서비스는 호출하는 방법에 대해 아무것도 모르고 작업자 라이브러리에서 메소드를 호출 할 수 있다는 것입니다. 이를 통해 작업용 데이터베이스에서 일정을 작성하고 핵심 시스템을 변경하지 않고도 클래스 라이브러리에 새로운 방법을 추가 할 수 있습니다.

기본 아이디어는 핵심 서비스에서 반사를 사용하여 일정을 정의하는 데이터베이스에 이름을 저장 한 메소드를 실행할 수 있다는 것입니다. 실제로는 꽤 깔끔합니다. 당사의 핵심 서비스는 견고하고 필요에 따라 작업을 실행하는 반면 실제 작업자 라이브러리는 핵심 보살핌없이 필요에 따라 확장 및 변경 될 수 있습니다.

추가 설명이 필요하다면 자유롭게 물어보십시오. 이것은 단순히 반성이 실제로 우리를 더 쉽게 만들 수있는 실제 시나리오를 설명하는 가장 좋은 방법이었습니다.

또 다른 예 : 데이터베이스의 출력을 취하는 코드가있는 코드가 있습니다. 데이터베이스 (열이있는 행이있는 행 세트)는 객체 배열로 공급됩니다. 나는 행을 반복하고 대상 객체에 동일한 이름과 유형의 속성이 있으면 설정했습니다. 이것은 내 데이터를 얻는 코드가 다음과 같은 것을 보게됩니다.

SqlDataReader sdr = Helper.GetReader("GetClientByID", ClientID);
Client c = new Client();
FillObject(sdr, c);
return c;

실제로 반사는 코드의 일종의 앰프로 생각해야합니다. 좋은 코드를 더 좋고 깨끗하게 만들 수 있으며 나쁜 코드가 악화 될 수 있습니다. 그것은 무엇을합니까? 그것은 실제로 코드를 작성할 수 있습니다. 코드를 작성할 수있는 시점에 무엇을할지 완전히 확신하지 못합니다. 일반적인 아이디어는 있지만 프로그램을 컴파일 할 때 어떤 객체, 메소드 및 속성이 실행되는지 코딩 할 수 없습니다.

다른 게시물은 프로그램이 구성 값을 기반으로 코드를 실행할 수 있다고 말할 때 정확하지만 실제로는 객체 지향 프로그래밍 규칙을 심각하게 구부릴 수 있다는 것입니다. 그것이 정말로하는 일입니다. 안전 조치를 끄는 것과 같습니다. 개인 방법과 속성은 다른 어떤 것과 함께 반사를 통해 액세스 할 수 있습니다.

MS가 반사를 사용하는 시점의 훌륭한 예는 데이터 객체의 데이터 바인딩을 사용하는 것입니다. 드롭 다운 목록 등에 바인딩 할 객체에 대한 텍스트 필드 및 데이터 필드의 이름을 지정하고 코드는 객체를 반영하고 적절한 정보를 꺼냅니다. 데이터 바인딩 객체는 반복해서 동일한 프로세스를 반복하지만 어떤 유형의 객체를 바인딩 해야하는지 모릅니다. 반사는 가능한 모든 사례를 처리하기 위해 약간의 코드를 작성하는 편리한 방법입니다.

Java에서는 기본적으로 수업에 대해 알지 못하고 수업을 인스턴스화하는 방법입니다. 사용자가 프로그램을 사용하려는 클래스를 추가하여 구성 파일을 변경할 수 있기를 원한다고 가정 해 봅시다 (일부 인터페이스의 수많은 구현이 있음). 반사를 사용하면 이름, 메소드 서명 등만 객체를 만들 수 있습니다. . 그런 다음 인터페이스에 캐스팅하십시오.

반사는 런타임 구성에 유용하여 시스템의 일부를 외부 구성을 통해 구동 할 수 있습니다.

예를 들어, 클래스 팩토리는 입력 파일을 기반으로 다른 콘크리트 유형을 구성 할 수 있습니다. 여기서 콘크리트 유형은 빌더 인터페이스를 사용하지 않고 콘크리트 생성자를 호출하기 위해 다른 구성 정보가 필요합니다. (반사를 사용하여 물체의 생성자 방법).

반사(기본적으로)의 능력 프로그램을 쿼리에 대한 정보를 입력할 수 있게 컴파일러입니다.그래서,예를 들어,형식의 이름을 조회할 수 있는 방법 이 포함되어 있습니다.다음 각 방법에 대한 쿼리할 수 있습의 유형에 대한 매개 변수들이었습니다.

그것은 유용한 런타임을 구성하 config 파일을 지정하는 행동에의 응용 프로그램입니다.구성 포함할 수 있습니다 이름은 콘크리트의 종류는 당신이 사용해야 한다(같은 경우가 종종 IOC 컨테이너).리플렉션을 사용하여 당신의 인스턴스를 만들 수 있는 이 콘크리트 타입(을 통해 반영 API)고 그것을 사용할 수 있습니다.

나는 당신에게 예를 들여 줄게.

프로그래밍 연습으로서 나는 MP3 파일 검사기를 썼습니다. 내 음악 라이브러리를 스캔하고 DatagridView에 관심이있는 ID1/ID2 태그를 표시합니다. 반사를 사용하여 UI 코드가 해당 클래스에 대해 알지 못하는 MP3 정보 클래스에서 속성을 얻습니다. 표시되는 정보를 변경하려면 MP3 정보 클래스를 편집하거나 구성을 변경할 수 있으며 (클래스 작성 방법에 따라) UI를 업데이트 할 필요가 없습니다.

또한 데이터 라이브러리 클래스를 교환하여 디지털 사진에 대한 정보를 표시하기 위해 종속성 주입을 사용하여 끝에서 동일한 정보를 사용할 수 있음을 의미합니다.

어셈블리에는 모듈이 포함되어 있고 모듈에는 유형이 포함되어 있으며 유형은 멤버를 포함합니다. 반사는 어셈블리, 모듈 및 유형을 캡슐화하는 객체를 제공합니다. 반사를 사용하여 유형의 인스턴스를 동적으로 생성하거나 유형을 기존 객체에 바인딩하거나 기존 객체에서 유형을 가져올 수 있습니다. 그런 다음 유형의 메소드를 호출하거나 필드 및 속성에 액세스 할 수 있습니다. 반사의 전형적인 사용에는 다음이 포함됩니다.

  • 어셈블리를 사용하여 어셈블리를 정의하고로드하고 조립 매니페스트에 나열된로드 모듈을 정의 하고이 어셈블리에서 유형을 찾아 인스턴스를 만듭니다.
  • 모듈을 사용하여 모듈과 모듈의 클래스가 포함 된 어셈블리와 같은 정보를 발견하십시오. 모듈에 정의 된 모든 글로벌 방법 또는 기타 구체적인 비정형 메소드를 얻을 수도 있습니다.
  • ConstructorInfo를 사용하여 이름, 매개 변수, 액세스 수정 자 (예 : 공개 또는 개인) 및 생성자의 구현 세부 정보 (예 : 추상 또는 가상)와 같은 정보를 발견하십시오. 특정 생성자를 호출하기 위해 유형의 getConstructors 또는 GetConstructor 메소드를 사용하십시오.
  • MethodInfo를 사용하여 이름, 반환 유형, 매개 변수, 액세스 수정 자 (공개 또는 개인) 및 메소드의 구현 세부 정보 (예 : 초록 또는 가상)와 같은 정보를 발견하십시오. 특정 방법을 호출하려면 유형의 getMethods 또는 getMethod 메소드를 사용하십시오.
  • FieldInfo를 사용하여 필드의 이름, 액세스 수정 자 (예 : 공개 또는 개인) 및 필드의 구현 세부 정보 (예 : 정적)와 같은 정보를 발견하고 필드 값을 얻거나 설정합니다.
  • EventInfo를 사용하여 이름, 이벤트 핸들러 데이터 유형, 사용자 정의 속성, 선언 유형 및 반사 된 이벤트 유형과 같은 정보를 발견하고 이벤트 처리기를 추가 또는 제거합니다.
  • PropertyInfo를 사용하여 이름, 데이터 유형, 선언 유형, 반사 된 유형, 속성의 읽기 전용 또는 쓰기 가능한 상태와 같은 정보를 발견하고 속성 값을 얻거나 설정합니다.
  • ParameterInfo를 사용하여 매개 변수 이름, 데이터 유형, 매개 변수가 입력 또는 출력 매개 변수인지 및 메소드 서명에서 매개 변수 위치와 같은 정보를 발견하십시오.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top