Java 에서 Class.forName()용법 에 대한 자세 한 설명
Class.forName()
Class.forName(xxx.xx.xx) ,
Class.forName(xxx.xx.xx) JVM , JVM 。
다음은 다음 세 가지 문 제 를 푸 는 것 을 통 해 Class.forName()의 용법 을 상세히 설명 한다.1.Class.forName()을 언제 사용 합 니까?문자열 변 수 를 드 리 겠 습 니 다.패키지 이름과 클래스 이름 을 대표 합 니 다.어떻게 예화 합 니까?당신 이 제일 먼저 생각 한 것 은 new 일 것 입 니 다.그러나 주의해 야 할 것 은 A=(A)Class.forName("pacage.A").new Instance()입 니 다.이것 은 당신 과 A=new A();같은 효과 입 니 다.
이제 본론 으로 들 어가 자.동적 으로 Class 대상 을 불 러 오고 만 듭 니 다.예 를 들 어 사용자 가 입력 한 문자열 에 따라 대상 을 만 들 려 면:String str="사용자 가 입력 한 문자열"을 사용 해 야 합 니 다.Class t = Class.forName(str); t.newInstance();
클래스 를 초기 화하 고 인 스 턴 스 를 만 들 때 new Instance()방법 과 new 키 워드 는 하 나 는 방법 이 고 하 나 는 키워드 외 에 가장 큰 차이 가 있 습 니까?이들 의 차 이 는 대상 을 만 드 는 방식 이 다르다 는 것 이다.전 자 는 클래스 로 딩 체 제 를 사용 하고 후 자 는 새로운 종 류 를 만 드 는 것 이다.그렇다면 왜 두 가지 생 성 대상 방식 이 있 을 까?이것 은 주로 소프트웨어 의 신축 가능,확장 가능,재사 용 가능 등 소프트웨어 디자인 사상 을 고려한다.
자바 에 서 는 공장 모드 가 new Instance()방법 으로 대상 을 만 드 는 경우 가 많 기 때문에 왜 공장 모드 를 사용 해 야 하 는 지 에 대해 서 는 구체 적 인 답 을 찾 을 수 있다.예 를 들 어 class c=Class.forName("Example");factory = (ExampleInterface)c.newInstance();
그 중에서 Example Interface 는 Example 의 인터페이스 로 다음 과 같은 형식 으로 쓸 수 있 습 니 다.String className="Example";class c = Class.forName(className); factory = (ExampleInterface)c.newInstance();
더 나 아가 다음 과 같은 형식 으로 쓸 수 있 습 니 다:String className=readfrom XML Config;/xml 프로필 에서 문자열 class c=Class.forName(className)을 가 져 옵 니 다.factory = (ExampleInterface)c.newInstance();
위의 코드 는 이미 Example 의 클래스 이름 이 존재 하지 않 습 니 다.Example 류 가 어떻게 변화 하 든 상기 코드 는 변 하지 않 고 Example 의 형제 류 Example 2,Example 3,Example 4 를 바 꿀 수 있다 는 장점 이 있 습 니 다.그들 이 Example Interface 를 계승 하면 됩 니 다.
JVM 의 측면 에서 볼 때
키워드 new 를 사용 하여 클래스 를 만 들 때 이 클래스 는 불 러 오지 않 을 수 있 습 니 다.그러나 new Instance()방법 을 사용 할 때 다음 과 같은 보증 을 해 야 합 니 다.1.이 종 류 는 이미 불 러 왔 습 니 다.2.이 종 류 는 이미 연결 되 었 습 니 다.위의 두 단 계 를 완성 한 것 은 바로 Class 의 정적 방법 forName()이 완성 한 것 입 니 다.이 정적 방법 은 시작 클래스 로 더,즉 자바 API 를 불 러 오 는 로 더 를 호출 합 니 다.
이 제 는 new Instance()가 실제로 new 라 는 방식 을 두 단계 로 분해 한 것 을 알 수 있다.즉,먼저 Class 로 딩 방법 으로 특정한 종 류 를 불 러 온 다음 에 예화 하 는 것 이다.이렇게 단계별 로 나 누 는 장점 은 분명 하 다.우 리 는 class 의 정적 로드 방법 forName 을 호출 할 때 더 좋 은 유연성 을 얻 고 결합 을 낮 추 는 수단 을 제공 할 수 있 습 니 다.
2.new 와 Class.forName()은 어떤 차이 가 있 습 니까?사실은 위 에서 언급 한 것 이 있 습 니 다.여기 서 정 리 를 하 겠 습 니 다.먼저,new Instance()는 방법 이 고 new 는 키워드 입 니 다.그 다음으로 Class 의 new Instance()의 사용 은 한계 가 있 습 니 다.생 성 대상 은 인삼 이 없 는 구조 함수 만 호출 할 수 있 고 new 키 워드 를 사용 하여 대상 을 생 성 하 는 데 는 이 제한 이 없습니다.쉽게 말 하면 new Instance():약 한 유형,비효 율,무 참 구조 만 호출 할 수 있 습 니 다.new:강 한 유형,상대 적 으로 효율 적 이 고 모든 Public 구 조 를 호출 할 수 있 습 니 다.Class.forName(")은 클래스 를 되 돌려 줍 니 다.Class.forName(").newInstance()는 object 를 되 돌려 줍 니 다.3.왜 데이터베이스 드라이버 를 불 러 올 때 유용 한 것 은 Class.forName()인 데 new Instance()를 호출 하지 않 았 습 니까?자바 개발,특히 데이터베이스 개발 에 서 는 Class.forName()이라는 방법 이 자주 사용 된다.자바 Documentation 을 조회 하면 Class.forName()정적 방법 을 사용 하 는 목적 은 동적 로드 클래스 를 위 한 것 임 을 알 수 있 습 니 다.일반적으로 인 코딩 과정 에서 로 딩 이 끝 난 후에 클 라 스 의 new Instance()정적 방법 으로 대상 을 예화 합 니 다.따라서 Class.forName()동적 로드 클래스 만 사용 하 는 것 은 소 용이 없 으 며,최종 목적 은 대상 을 예화 하 는 것 입 니 다.
데이터베이스 개발 경험 이 있 는 친구 들 은 왜 우리 가 데이터베이스 드라이버 를 불 러 올 때 new Instance()방법 을 사용 하지 않 았 는 지 알 게 될 것 이다.즉,jdbc 가 데이터 베 이 스 를 연결 하 는 쓰기 에는 Class.forName(xxx.xx.xx)이 있 습 니 다.그리고 일부:Class.forName(xxx.xx.xx),new Instance(),왜 이 두 가지 쓰기 가 있 습 니까?방금 말 했 듯 이 Class.forName(");JVM 에서 지정 한 종 류 를 찾 고 불 러 오 라 고 요구 하 는 역할 을 합 니 다.먼저 자바 에 있 는 모든 class 는 가상 컴퓨터 에 불 러 와 야 실행 할 수 있 습 니 다.정적 코드 는 class 와 연결 되 어 있 습 니 다.class 불 러 오 는 데 성공 하면 정적 코드 를 실 행 했 음 을 나타 내 고 앞으로 이 정적 코드 를 더 이상 사용 하지 않 을 것 입 니 다.앞에서 도 말 했 듯 이 Class.forName(xxx.xx.xx)의 역할 은 JVM 에 게 지정 한 종 류 를 찾 아 불 러 오 라 고 요구 하 는 것 입 니 다.클래스 에 정적 초기 화가 있 으 면 JVM 은 반드시 이러한 정적 코드 세그먼트 를 실행 할 것 입 니 다.JDBC 규범 에 서 는 이 Driver 류 가 DriverManager 에 자신 을 등록 해 야 한 다 는 것 을 명 확 히 요구 합 니 다.즉,JDBC Driver 의 Driver 류 코드 는 다음 과 같 아야 합 니 다.Public class MyJDCDriver implements Driver{static{DriverManager.registerDriver(new MyJDCDriver();}}정적 초기 화 기 에 등 록 된 이상 JDBC 를 사용 할 때 Class.forName(XXX.XXX)만 필요 합 니 다.됐 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.