나는 프로젝트의 클래스와 메소드에 대한 "id"의 유일성을 검사하는 IdChecker 프로그램을 구현 중이다. IdChecker는 릴리스를 푸시하기 전에 프로젝트를 컴파일 할 때만 실행됩니다.클래스를 알고있을 때 메소드를 올바르게 호출하는 방법은 무엇입니까?
클래스의 경우 모든 클래스를 매핑해야하므로 MyClass.getField ("CLASS_ID")를 호출하면됩니다. getShort (MyClass.getField ("CLASS_ID")); 그런 다음 className과 classIdentifier가 포함 된 ClassWrapper를 만듭니다.
메소드의 경우 리플렉션을 사용하여 메소드에 로컬 인 변수에 액세스 할 수 없으므로 좀 더 복잡합니다 ...하지만 ... 내 프로젝트에서는 디버그 로그를 사용하여 모든 로그를 남깁니다. "진입 방법"및 "이탈 방안". 로컬 변수를 얻으려면 메소드를 호출하고이 로그 항목에서 마지막 항목 ("leave-the-method"로그 항목)을 내 logBuffer에서 읽으면 METHOD_ID가 표시됩니다.
내 문제: 나는 IllegalArgumentException를 생성하는 클래스에 메소드를 호출 할 수 없습니다
... 나는 방법에 매개 변수를 전달할 필요가 없습니다 , 나는 단지 내가 할 수있는 그 (것)들을 호출 할 로그 항목을 생성하십시오.
private void getMethodsList() throws IllegalArgumentException,
IllegalAccessException, NoSuchFieldException, SecurityException {
final short METHOD_ID = 0x03;
/* Log-entering the method */
mLogger.logDebug((byte) 1, METHOD_ID);
/* Create the MethodWrapper list corresponding
to each element of the ClassWrapper list */
for(Class<?> clazz : mClasses)
{
/* Get the declared methods from each class */
for(Method method : clazz.getDeclaredMethods())
{
/* Get the name of the method */
String newName = method.getName();
short newIdentifier = 0;
try
{
method.invoke(clazz, new Object[]{null});
/* Get the identifier of the class */
newIdentifier = AbstractDebugLogger.mLastMethodID;
}
.
.
.
'Method # invoke (..)'의 javadoc을 읽으십시오. 그것은 인수로서 기대하는 것이 명백합니다. –
이 경우에는 맞춤 주석을 사용하는 것이 더 정확할 것입니다 (예 :'@MethodId (0x03)'). –