티스토리 뷰
Class 클래스중에 forName 메소드를 호출할 때 발생하는 예외인 ClassNotFoundException 을 알아보자.
아래와 같이 프로젝트 하나 만들고 패키지도 2개 만들어 주자.
첫번째로 com.reflection.target 패키지 안에 TargetClass1 클래스를 만들자.
클래스 안에 아무것도 안넣어도 된다. 그냥 Class.forName 으로 찾을 타켓 클래스를 만드는 것뿐이니까.
package com.reflection.target; public class TargetClass1 { }
두번째로 Class.forName 를 실행할 테스트 클래스를 만들자. 앞에 만든 클래스를 가지고 테스트하게 된다.
package com.reflection.sample; public class ClassForNameSample { public void execute(){ try { Class clazz = Class.forName("com.reflection.target.TargetClass99"); System.out.println("정상종료"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args){ new ClassForNameSample().execute(); } }
실행하면 알겠지만, 예외없이 "정상종료" 메시지가 출력되면서 프로그램이 종료된다.
저 ClassNotFoundException 예외는 언제 발생하는 것일까.
com.reflection.target 패키지에 있지도 않는 TargetClass99 라고 고쳐서 실행해보자.
Class clazz = Class.forName("com.reflection.target.TargetClass99");
java.lang.ClassNotFoundException: com.reflection.target.TargetClass99
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.reflection.sample.ClassForNameSample.execute(ClassForNameSample.java:8)
at com.reflection.sample.ClassForNameSample.main(ClassForNameSample.java:18)
없는 클래스를 찾으니 당연히 예외가 발생해버리게 된다.
이번엔 클래스명은 맞게 하고 패키지 정보를 틀리게 넣어보자.
Class clazz = Class.forName("com.reflection.TargetClass1");
java.lang.ClassNotFoundException: com.reflection.TargetClass1
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.reflection.sample.ClassForNameSample.execute(ClassForNameSample.java:8)
at com.reflection.sample.ClassForNameSample.main(ClassForNameSample.java:18)
당연히 에러다. 클래스명 뿐만 아니라 패키지정보 역시 정확히 넣지 않으면 똑같은 에러가 발생하니 유념해야 한다.
Java Reflection 관련글
1. Class 클래스의 forName 메소드 - ClassNotFoundException
2. Constructor 클래스의 getConstructor 와 getDeclaredConstructor 차이 비교
3. Constructor 클래스 newInstance 메소드 - IllegalArgumentException 예외
4. Constructor 클래스 newInstance 메소드 - InstantiationException 예외
- Total
- Today
- Yesterday
- 도넛차트
- ipTIME
- SVN
- vagrant
- R
- Oracle
- heroku
- 막대그래프
- MyBatis
- github
- ubuntu
- 마인크래프트
- MongoDB
- python
- Spring
- ggplot2
- eclipse
- java
- ktm모바일
- 셀프개통
- 맥북
- 아이맥
- docker
- 자급제폰
- Google Chart Tools
- ggplot
- 알뜰요금제
- MySQL
- javascript
- 이클립스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |