2010-04-03 3 views
-1

각 배열에 createtempobjectname() 메서드로 만든 "이름"을 지정하여 런타임에 배열을 인스턴스화 할 수있는 클래스를 만들려고합니다. 이 프로그램을 실행하는 데 문제가 있습니다. 또한 런타임 중에 생성 된 특정 객체에 액세스하여 값을 변경하거나 액세스하여 해당 어레이에 액세스하는 방법을 확인하고자합니다. 이것은 지금까지 내 엉망입니다, 컴파일하지만 런타임 예외가 발생합니다.Java : 런타임에 다른 이름의 배열 객체를 만들고 액세스/업데이트

import java.lang.reflect.Array; 

public class arrays 
{ 
    private static String temp; 
    public static int name = 0; 
    public static Object o; 
    public static Class c; 

     public static void main(String... args) 
     { 
      assignobjectname(); 
      //getclassname();//this is supposed to get the name of the object and somehow 
          //allow the arrays to become updated using more code? 
     } 
     public static void getclassname() 
     { 
      String s = c.getName(); 
      System.out.println(s); 
     } 
     public static void assignobjectname()//this creates the object by the name returned 
     {         //createtempobjectname() 
      try 
      { 
       String object = createtempobjectname(); 
       c = Class.forName(object); 
       o = Array.newInstance(c, 20); 
      } 
      catch (ClassNotFoundException exception) 
      { 
       exception.printStackTrace(); 
      } 
     } 
     public static String createtempobjectname() 
     { 
      name++; 
      temp = Integer.toString(name); 

      return temp; 
     } 
} 
+0

왜 이렇게했는지 설명하면 도움이 될 것입니다. 여기에서하려고하는 것보다 성취하려고 시도하는 것에 대해 훨씬 더 깨끗한 방법이있을 것입니다. 이 배열의 핵심은 무엇입니까? 왜 그들은 이름을 지어야합니까? 그들에게 무엇을 저장할 것입니까? –

+0

두 개 이상의 개체를 구별 할 수있는 다른 방법이 없으므로 이름을 지정해야합니다. ArrayList를 저장하는 것과 비슷하지만 arraylist에 액세스해야 할 때마다 객체에서 문자열을 추출하는 것이 너무 느립니다. – pandoragami

답변

0

@ Ash의 답변에서 다음은 몇 가지 설명 코드입니다. 반사와 관련된 것이 없다는 것을 주목하십시오. 그게 더 밀접하게 당신이 (내 생각) 무엇을하려고에 정렬되어 있기 때문에

Map<String, Object> myMap = new HashMap<String, Object>(); 
... 
Object myObject = ... 
myMap.put("albert", myObject); // record something with name "albert" 
... 
Object someObject = myMap.get("albert"); // get the object named "albert" 
// get("albert") would return null if there nothing with name "albert" 

편집 나는, 유형 개체를 사용하는 예를 수정했습니다. 하지만 당신은 Object가 아닌 모든 타입을 사용할 수 있습니다 ... 예제 전체에서 타입을 바꿉니다. 그리고 ArrayList를 사용하여 동일한 작업을 수행 할 수 있습니다. 예를 들면 다음과 같습니다.

아무 유형 변환도 필요하지 않습니다.

+0

처음에 문자열을 저장 한 경우 "albert"라는 객체를 문자열로 변환해야합니까 (대개 객체를 저장하는 ArrayList에 필요하며이 객체에서 "읽기"는 형 변환이 필요함)? "albert"를 쓰거나 읽는 것에 대해 어떻게 생각합니까? 아니면 myMap.get ("albert")가하는 것입니까? 지금까지 도움을 주셔서 감사합니다, 나는 아무런 평판이 없기 때문에 줄 쿠키가 없습니다. – pandoragami

+0

글쎄, 이제 스레드를 해결할 것 같아. 어떻게 나타낼 수 있습니까? – pandoragami

+0

가장 유용한 답을 솔루션으로 선택하고 문제를 이해하고 해결하는 데 도움을 준 답변에 투표하여 질문에 답변으로 표시해야합니다. – stefanglase

3

지도를 작성하면 키가 사용자 이름이고 값이 사용자의 배열 일 때 키/값 쌍을 추가 할 수 있습니다.

0

나는 당신이이 줄에서 ClassNotFoundException을 받고있어 기대 :

c = Class.forName(object); 

유효한 클래스 이름이 아닙니다 그것이라고 처음 "1"object의 값.

Class.forName은 입력 할 때 클래스 이름이 필요합니다 (예 : "java.lang.Integer"). 이런 방식으로 배열의 이름을 지정하는 것은 나에게 의미가 없습니다. 적절한 Java 클래스 이름을 선택해야합니다.

배열 인스턴스를 만든 후에 이름을 지정하려면 이름을 키로 사용하여 Map의 값으로 인스턴스를 저장할 수 있습니다.

+0

나의 경험이 부족해서 미안하지만 나는 자바를 처음 접했고 심지어지도조차 사용 해본 적이 없다. 네가 내게 모범을 줄 수 있는지 궁금 하네. – pandoragami

관련 문제