2013-09-29 3 views
1

클래스가 있는데 ModelX라는 클래스가 있다고 가정 해 봅시다.하지만 런타임까지이 클래스에 대해 프로그램이 알지 못합니다. 그래서 Java : 문자열에서 클래스 초기화

내가 할 수없는 그것을 만들 :

private ModelX aModel; 

을 아직 이름이나 실존을 알지 못하기 때문에 할 않는 유일한 것은 간단한 .txt 인 말에서 이름을 읽어 파일.

내가 예를 들어

String x = "ModelX"; 
cls = Class.forName("x"); 
Object obj = cls.newInstance(); 

을 할 수 있도록 내가 '

aModel = new obj(); 

and 

private obj aModel; 

을 할 수 있도록이, 생성자를 얻을 다음 문자열에서 클래스를로드 할 수있는 방법 설명이 모호하지만 미안하지만 원하는 것을 설명하는 방법을 알지 못합니다.

나는이 작업을 수행 할 수 있어야합니다 :

aModel = new ModelX(); 
private ModelX aModel; 

내가 문자열에서 ModelX을 가지고 있지만.

답변

3

먼저 Class.forName() 메서드는 정규화 된 클래스 이름을 필요로합니다. (가) 예 ModelX, 예를

package com.example; 

public class ModelX {...} 

를 들어 .에 의해 분리 된 패키지 이름에 추가하면

Class clazz = Class.forName("com.example.ModelX"); 

두 번째로 사용하는 것이 클래스 간단한 이름, 클래스 Class는 AA 몇 가지 방법이있다 Constructor 인스턴스를 얻으려면 You can see and read about those in the javadoc. 당신의 ModelX 클래스는 접근 인자없는 생성자가있는 경우, 당신은 직접 당신이 적절하게 캐스팅해야합니다

Object instance = clazz.newInstance(); 

로 전화를 걸 수 있습니다.

+0

이 너무 도움이 될 수 있습니다 http://www.javapractices.com/topic/TopicAction.do?Id=113 –

0

Java는 컴파일 타임에 알려지지 않은 유형을 참조하도록 허용하지 않습니다. 따라서 ModelX 만 런타임에 알려진 것입니다 경우

private ModelX aModel; 

를 작성할 수 없습니다.

당신이 주위에 몇 가지 방법이 있습니다

  • 당신은 정의 할 수 있습니다 자신의 ModelX, 모두 같은 방법과 인터페이스를 가지고 있지만, 순수 스텁 구현을 가지고 동일한 패키지 등이있다. 실제 구현을 런타임에 가져올 수 있도록 준비 할 수 있습니다 (예 : 파일로 스텁을 컴파일하여 최종 .jar에 포함되지 않음). 예를 들어 Android에서 실제로 장치에서만 구현되는 탐색 가능한 Android 클래스를 Eclipse에 제공하는 방식입니다.
  • 비슷한 방법으로 구현 된 프록시 클래스를 정의 할 수 있습니다 (예 : ModelProxy). 리플렉션을 통해 런타임로드 된 클래스로 전달합니다.다음과 같이 반사를 사용할 수 있습니다
0

,

String x = "com.example.ModelX"; 
Class cls = Class.forName(x); 
Object obj = cls.newInstance();