2008-10-12 17 views
82

Ryan DelucchiTom Hawtin의 대답에 주석 # 3 here 질문 :Class.newInstance()가 "악"인 이유는 무엇입니까?

이유에 Class.newInstance() "악"? 코드 샘플에 응답

는 :

// Avoid Class.newInstance, for it is evil. 
Constructor<? extends Runnable> ctor = runClass.getConstructor(); 
Runnable doRun = ctor.newInstance(); 

그래서, 왜 악마인가?

+9

실제로이 질문에 대한 답변을 보는 것 : Class.newInstance()뿐만 아니라 다양한 리플렉션 사용에 대해 이렇게 말할 수 있습니다. 그래서 이것은 "reflection이 compile-time checking을 패배시킨다"는 일반적인 관찰입니다 ... 이것은 흔히 반성의 요점입니다. –

+23

요즘 아이들은 "사악한"단어를 던져 버렸지 만 COBOL이나 FORTRAN 프로그램을 보지 못했습니다! 당신은 "EVIL"이 시뮬레이션 배경을 가진 땜장이로 프로젝트에서 프로젝트로 넘어온 20 년 된 FORTRAN 프로그램을보고 싶습니다. CS가 영향을 미치지 않습니다! 이제 "사악 해!" – NoMoreZealots

+0

또한보십시오 http://stackoverflow.com/q/36272566/3888450 –

답변

71

자바 API 문서는 이유를 설명 (http://java.sun.com/javase/6/docs/api/java/lang/Class.html#newInstance()) :이 방법은 확인이 끝난 예외를 포함하여 인수 없음의 생성자에 의해 throw되는 예외를 전파

하는 것으로. 이 방법을 사용하면 컴파일러가 수행해야하는 컴파일 타임 예외 검사를 효과적으로 우회 할 수 있습니다. Constructor.newInstance 메서드는 생성자가 throw 한 예외를 (확인한) InvocationTargetException에 래핑하여이 문제를 방지합니다.

즉, 검사 된 예외 시스템을 무력화시킬 수 있습니다.

+11

이것은 일반적으로 반영의 본질입니다 ... 모든 Constructor.newInstance() 특정 없습니다. –

+23

@ 라이언 : 그건 사실이 아니야. 다른 모든 리플렉션베이스의 호출 메소드는, 불려가는 메소드에 의해 슬로우 된 throw 가능 객체를 랩하는,'InvocationTargetException'라고하는 체크 된 예외를 Throw합니다. 'Class.newInstance'는 그렇게하지 않을 것입니다 --- 그것은 체크 된 예외를 직접 던질 것입니다. 부정적인 점은, javac는'Class.newInstance'가 그것들을 버리기 위해 선언되지 않았기 때문에 javac가 당신이 그 예외들을 잡으려고 시도하지 못하게하는 것입니다. –

+1

어, 고맙습니다 .--) 고마워요. –

18

또 하나의 이유는

현대 IDE를 사용하면 클래스의 용도를 찾을 수 있습니다 - 당신과 당신의 IDE 변경하려는 클래스를 사용하여 어떤 코드를 알고있는 경우는, 리팩토링시에 도움이됩니다.

명시 적으로 생성자를 사용하지 않고 Class.newInstance()를 대신 사용하는 경우 리팩토링 중에 해당 사용법을 찾지 못할 수도 있으며 컴파일 할 때이 문제는 자체적으로 나타납니다.

+15

리플렉션을 사용하는 일반적인 잡았다. –