2014-03-25 2 views
2

classDeclarations에 적용 할 사용자 지정 특성을 만들려고합니다. 클래스의 다른 메서드에서 특성을 열거 할 수 있지만 어떤 종류의 특수 메서드이기 때문에 classDeclaration 자체는 열거 할 수 없습니다.reflection을 사용하여 classDeclaration에서 속성을 검색하는 방법

SysObsoleteAttribute (커널에서 호출 됨)가 classDeclarations에 배치 되었기 때문에 가능하다는 것을 알고 있습니다.

Classes\CustCustomerService\create이 테스트의 맨 위에는 특성이 Classes\CustCustomerService\classDeclaration으로 복사되었습니다.

static public void AttribsOfSysEntryPointAttributeOnMethod 
      (
      str _sNameOfClass, 
      str _sNameOfMethod, 
      str _nameOfAttribute 
      ) 
{ 
    int nClassId; 

    SysDictMethod  sdm; 
    Object attributeAsObject; 
    SysDictClass   sysDictClass; 

    Array     attribArray = new Array(Types::Class); 
    int i; 

    nClassId = Global::className2Id(_sNameOfClass); 

    sysDictClass = new SysDictClass(nClassId); 

    sdm = new SysDictMethod(UtilElementType::ClassInstanceMethod, nClassId, _sNameOfMethod); 

    attribArray = sdm.getAllAttributes(); 

    if (attribArray) 
    { 
     for (i=1; i<=attribArray.lastIndex(); i++) 
     { 
      attributeAsObject = attribArray.value(i); 

      info(strFmt("[%3] Attrib Class Id: %1 [%2]", classIdGet(attributeAsObject), classId2Name(classIdGet(attributeAsObject)), _sNameOfMethod)); 

     } 
    } 
    else 
    { 
     // Unable to get attributes, try another way 
     error(strFmt("Unable to retrieve attribute array for method %1", sdm.name())); 

     // It is, so let's try and enumerate ALL attributes and output them directly from class dec 
     sdm = sysDictClass.objectMethodObject(1); 

     if (attribArray) 
     { 
      for (i=1; i<=attribArray.lastIndex(); i++) 
      { 
       attributeAsObject = attribArray.value(i); 

       info(strFmt("[%3] Attrib Class Id: %1 [%2]", classIdGet(attributeAsObject), classId2Name(classIdGet(attributeAsObject)), _sNameOfMethod)); 

      } 
     } 
     else 
      error(strFmt("Still unable to retrieve attribute array for method %1", sysDictClass.objectMethod(1))); 
    } 
} 

이 그 다음을 호출하는 작업을 생성하고 하나의 방법을 위해 작동하지만 다른하지 당신은 어떻게 볼 수 있습니다
[AifDocumentCreateAttribute, SysEntryPointAttribute(true)] 
class CustCustomerService extends AifDocumentService 
{ 

} 

나는 새로운 클래스에 정적 메서드를 만들었습니다.

static void Job5(Args _args) 
{   
    AttributeReflection::AttribsOfSysEntryPointAttributeOnMethod("CustCustomerService", "create", "SysEntryPointAttribute"); 
    AttributeReflection::AttribsOfSysEntryPointAttributeOnMethod("CustCustomerService", "classDeclaration", "SysEntryPointAttribute"); 

} 

어떤 아이디어가 classDeclaration에서 열거하는 법 ??

답변

1

classDeclaration은 메서드가 아니므로 호출 할 수 없습니다. 따라서 sysDictClass 변수가 null입니다.

attribArray = sdm ? sdm.getAllAttributes() : sysDictClass.getAllAttributes(); 
+0

AH 우수함 :

GooglinggetAllAttributes 방법은 DictClass에 빠져 있음을 알 수있다. 그래서 그것은 클래스 레벨의 속성이지 메소드 레벨이 아닙니다. 내'sysDictClass' 변수가 null이 아닙니다. 아마도 당신은'attribArray' 변수를 의미했을 것입니다. –

관련 문제