# Fehlermeldung: the method.... ist undefined for the type object



## MK234 (14. Jul 2011)

Hallo,

kann mir jemand sagen,wie ich mein Programm abändern muß, damit ich die obige Fehlermeldung bei den Methoden addPerson  und   getPersons   nicht mehr erhalte.
Denn selbst wenn ich  ((Object) t).addPerson(p1)  statt t.addPerson(p1)  eingebe, bleibt die
Fehlermeldung. 
Muß ich irgendwie die Methodendefinitionen abändern?

Vielen Dank.


```
public class Main {
	public static void main(String[] ss) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		
		Class klasse = Class.forName(ss[0]);		
		Object  t = klasse.newInstance();
			
		String name1 = "Müller";
		String prename1 = "Johannes";
		Person p1 = new Person(name1, prename1);
		((Object) t).addPerson(p1);	
		
		String name2 = "Müller";
		String prename2 = "Maria";
		Person p2 = new Person(name2, prename2);
		t.addPerson(p2);
		
		String name3 = "Kühler";
		String prename3 = "Heidemarie";
		Person p3 = new Person(name3, prename3);
		t.addPerson(p3);
		
		Person[] per = t.getPersons("Müller");
		for(int i = 0; i < per.length; i++) {
			System.out.println(per[i]);
		}		
	}
}
```


----------



## eRaaaa (14. Jul 2011)

```
Object  t = klasse.newInstance();
```

Da musst du wohl eher casten


----------



## Aldimann (14. Jul 2011)

Wieso instanziierst du überhaupt eine Klasse deren Name per Argument mitgegeben wird?


----------



## MK234 (14. Jul 2011)

Das Programm ist noch lange nicht fertig.
Es soll sich dabei vorerst um einen Test einer Klasse handeln, deren Name im Code nicht auftauchen soll, sondern der main()-Methode als String übergeben werden soll. Anschließend soll ein Exemplar dieser Klasse erzeugt werden und mit diesem Tests durchgeführt werden.


----------



## Ariol (14. Jul 2011)

Object kennt ja nicht die Methoden der gerade geladenen Klasse.
Dein Vorgehen ist seltsam, was hast du denn vor?


Per Reflection läßt sich das so lösen:

```
public class Main {
	public static void main(String[] ss) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		
		Class klasse = Class.forName(ss[0]);		
		Object  t = klasse.newInstance();
		Method addPerson = klasse.getMethod("addPerson", Person.class);
		Method getPersons = klasse.getMethod("getPersons", String.class);	
		
		
		String name1 = "Müller";
		String prename1 = "Johannes";
		Person p1 = new Person(name1, prename1);
		addPerson.invoke(t,p1);	
		
		String name2 = "Müller";
		String prename2 = "Maria";
		Person p2 = new Person(name2, prename2);
		addPerson.invoke(t,p2);
		
		String name3 = "Kühler";
		String prename3 = "Heidemarie";
		Person p3 = new Person(name3, prename3);
		addPerson.invoke(t,p3);
		
		Person[] per = (Person[])getPersons.invoke(t, "Müller");
		for(int i = 0; i < per.length; i++) {
			System.out.println(per[i]);
		}		
	}
}
```


----------



## Aldimann (14. Jul 2011)

Hmm ich kenne ein ähnliches Problem...

Du wirst nur auf einen Weg ganz ohne den erwähnung der konkreten Klasse auskommen. Und zwar über ein Interface das die Methoden die du ansprechen willst bereit stellt und von deiner Klasse implementiert wird.

Als Datentyp für die Instanz deiner per Parameter übergebenen Klasse musst du dann das Interface nehmen

```
Class klasse = Class.forName(ss[0]);        
        MyInterface  t = klasse.newInstance();
```


----------



## MK234 (14. Jul 2011)

ja genau, daß ist es über ein Interface.
super jetzt klappt es.
Vielen Dank, ein super Tipp


----------

