티스토리 뷰


java.lang.IllegalAccessException 에러 해결 방법

오늘은 아주 가끔 만날수 예외를 알아보자. IllegalAccessException라는 녀석인데 직역하면 불법접근예외다. java.lang.IllegalAccessException 에러의 원인은 접근할수 없는 필드나 메소드에 접근하는 경우에 발생한다고 생각하면 되겠다. 

 

Case 1. 컴파일 시에 참조되었던 클래스, 필드, 메소드가 실제 프로그램 구동환경 하에 참조하려고 할 때 접근할 수 없는 경우

 

클래스가 삭제되었거나 다른 버전의 소스가 컴파일 되어 넣어지는 경우 발생할 수 있다. 자신이 직접 개발하는 소스는 IDE가 자동으로 감지하여 에러를 뱉어줘서 컴파일 에러를 발생시켜서 발생하기 쉽지 않고 통상적으로 참조하는 라이브러리의 버전이 다른 경우 많이 발생한다. 따라서 참조하는 라이브러리의 클래스, 필드, 메소드에서 많이 발생할 것이고 만일 발생한다면 버전이 맞는지 다시 확인해보는 것이 좋다.


Case 2. 리플렉션을 사용하는데 참조 할수 없는 클래스, 필드, 메소드를 참조하는 경우.

 

첫번째 케이스는 재연해보라면 못할 것도 없지만 개발툴에서 자동으로 잡아내서 커맨드 컴파일과 커맨드 실행에서 javac로 컴파일 한 다음에 참조하는 클래스를 삭제하거나 변경을 가한 뒤에 java 명령어로 프로그램을 실행하면 IllegalAccessException를 만날 수 있다. 

 

나는 개발툴로 재연을 할 것이기 때문에 리플렉션을 사용하는 Case 2를 재연해 볼 것이다. 

 

1. private 함수를 가지는 클래스를 하나 만든다. 

package practice;

public class Test_IllegalAccessException2 {
    private static void test(){
        System.out.println("Test_IllegalAccessException2 test");
    }
}

 

2. 리플렉션을 이용해서 private 함수를 참조하여 호출해보자.

package practice;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Test_IllegalAccessException {
    public static void main(String[] args) throws Exception {
        Test_IllegalAccessException2 t = new Test_IllegalAccessException2();
        Method m = t.getClass().getDeclaredMethod("test");
        m.invoke(null);
    }
}

 

3. java.lang.IllegalAccessException 에러가 발생하는 것을 확인.

Exception in thread "main" java.lang.IllegalAccessException: class practice.Test_IllegalAccessException cannot access a member of class practice.Test_IllegalAccessException2 with modifiers "private static"
	at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
	at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
	at java.base/java.lang.reflect.Method.invoke(Method.java:558)
	at practice.Test_IllegalAccessException.main(Test_IllegalAccessException.java:10)

참조하려는 클래스의 상태가 매우 이상한 상태이니 다시 열어보도록 그리고 개발환경과 실행환경의 상태가 다르니 점검을 해야한다. 참조하는 라이브러리 버전 문제인 경우도 다수일 수 있다. 


댓글
최근에 올라온 글
최근에 달린 댓글