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에서 열거하는 법 ??
AH 우수함 :
Googling는
getAllAttributes
방법은DictClass
에 빠져 있음을 알 수있다. 그래서 그것은 클래스 레벨의 속성이지 메소드 레벨이 아닙니다. 내'sysDictClass' 변수가 null이 아닙니다. 아마도 당신은'attribArray' 변수를 의미했을 것입니다. –