2013-08-14 3 views
2

차의 인스턴스 인 myCar라는 개체가 있다고 가정 해 보겠습니다.개체 클래스의 새 인스턴스 만들기

myCar = new Car(); 

개체를 기반으로 해당 클래스의 새 인스턴스를 만들려면 어떻게해야합니까? myCar가 어떤 클래스에서 만들어 졌는지 알지 못한다고 가정 해 봅시다.

otherObject = new myCar.getClass()(); // Just do demonstrate what I mean (I know this doesn't work) 

UPDATE

public class MyClass { 
    public MyClass(int x, int y, Team team) { } 
    public MyClass() { } 
} 

Object arg = new Object[] {2, 2, Game.team[0]}; 

try { 
    Constructor ctor = assignedObject.getClass().getDeclaredConstructor(int.class, int.class, Team.class); 
    ctor.setAccessible(true); 
    GameObject obj = (GameObject) ctor.newInstance(arg); 

} catch (InstantiationException x) { 
    x.printStackTrace(); 
} catch (IllegalAccessException x) { 
    x.printStackTrace(); 
} catch (InvocationTargetException x) { 
    x.printStackTrace(); 
} catch (NoSuchMethodException x) { 
    x.printStackTrace(); 
} 

나는 다음과 같은 오류 얻을 : 작품과 세 개의 인수 내 생성자를 찾습니다)

java.lang.IllegalArgumentException: wrong number of arguments 

getDeclaredConstructor을 (그러나 newInstance와 (ARG)가 작동하지 않습니다 어떤 이유로, 그것은 "잘못된 인수의 수"라고 말합니다. 왜 그런가? 반사 클래스를 가정

otherObject = myCar.getClass().newInstance(); 

+0

도움이 필요합니다. http://stackoverflow.com/questions/7698237/whats-the-properway-to-use-reflection-to-instantiate-objects-of-unknown-classe – LokiSinclair

답변

15

는 기본 생성자가 있습니다. 기본값이 아닌 (비어있는) 생성자로 고급 작업을 수행 할 수 있습니다.

Constructor[] constructors = myCar.getClass().getConstructors(); 

원하는 것을 선택하십시오.

Java Reflection 기능에 대한 자세한 내용은 this을 통해 읽으십시오. 당신은 기본 생성자가 필요

Car newCar=myCar.getClass().newInstance(); 

당신도 예외가 InvocationTargetException에 싸여받을 것을 기억해야합니다

+0

감사합니다. 생성자에 매개 변수를 전달할 수있는 방법이 있습니까? – lawls

+0

@lawls 더 고급 주제 인 [here 's] (http://docs.oracle.com/javase/tutorial/reflect/member/ctorInstance.html) 방법. 인수를 ['newInstance()']에 전달해야합니다 (http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Constructor.html#newInstance (java.lang.Object ...)) 메소드를 호출한다. 생성자가 그 인수를 받아들이는 경우에만. –

+0

나는 인수가있는 배열을 전달해야한다고 말한다. 두 개의 인수 인 문자열과 int가 있다고 가정 해 보겠습니다. 다른 배열로 배열을 만들려면 어떻게해야합니까? 감사. – lawls

0

당신은 클래스 객체에 newInstance(를 호출합니다.

클래스에 기본 생성자가 없으면 비 반사 팩토리 또는 생성자 없이는 불가능합니다.

InstantiationException - if this Class represents an abstract class, an interface, an array class, a primitive type, or void; or if the class has no nullary constructor

0

리플렉션을 통해. 이 옵션을 사용합니다 :

myCar.getClass().newInstance(); 
0

당신의 UPDATE/오류에 대해서 - 이쪽을 봐 :이 작동하고 원하는 출력을 생성

public class DupaReflect { 

    private String name; 
    private int id; 

    private DupaReflect(String name, int id) { 
     super(); 
     this.name = name; 
     this.id = id; 
    } 

    @Override 
    public String toString() { 
     return "DupaReflect [name=" + name + ", id=" + id + "]"; 
    } 

    public static void main(String[] args) throws Exception { 
     Object[] objects = new Object[] { "asd", 1 }; 
     DupaReflect dupa = DupaReflect.class.getDeclaredConstructor(String.class, int.class).newInstance(objects); 
     System.out.println(dupa); 
    } 

} 

. DupaReflect [name=asd, id=1]

Object[] objects = new Object[]{"asd", 1}; - 이것이 내 코드가 작동하는 이유입니다.

Object arg = new Object[] {2, 2, Game.team[0]};

Object[] 실제로 자바 Object의 유형입니다, 그러나 이것은 해당 배열되는 하나의 객체로 일부 개체의 3 요소 배열을 변경 : 코드에서

당신이 있습니다. 따라서 3 개의 인수가 아닌 1로 새 객체를 만들려고하면 예외가 발생합니다.

해결 방법 : Object argObject[] args으로 지정하면 모두 작동합니다.

관련 문제