# Externe (unbekannte) Klasse nutzen



## thE_29 (6. Sep 2004)

Hi!

Ich will nur mal wissen ob es vielleicht ein KeyWord gibt, mit dem man eine Variable (also Klasse) vereinbaren kann, ohne das sie zur Compilierzeit vorliegen muss!

Sprich


```
public class Otherclass
{
   private mainClass myClass = null;
   /// FUNKTIONEN
   public OtherClass(mainClass cl)
   {
      this.myClass = cl;
   }

   private void someFkt()
   {
      myClass.setState(true);
   }
}
```

Nur, die Klasse mainClass liegt nicht vor, weil ich das jar Paket eigentlich nur extern laden will (sprich nicht wirklich einbinde ins projekt)

Geht sowas überhaupt? Bzw, wie geht das?

MfG


----------



## Bleiglanz (6. Sep 2004)

das geht nicht, alles was zu zur Übersetzungszeit verwenden willst, muss im Classpath sein

einzige Lösung wäre Reflection (via Class.forname die Klasse und dann Methoden dynamisch aufrufen)


----------



## thE_29 (6. Sep 2004)

irgendwie muss das ja gehen könnne....!

bild mir ein in c ging sowas einmal..


----------



## Bleiglanz (6. Sep 2004)

> Nur, die Klasse mainClass liegt nicht vor, weil ich das jar Paket eigentlich nur extern laden will (sprich nicht wirklich einbinde ins projekt)



Das ist doch totaler Käse, wenn du das jar Paket zur Laufzeit einbinden kannst, warum kannst du es dann nicht beim kompilieren reinhängen?


----------



## thE_29 (6. Sep 2004)

das ist kein Käse!

Weil nicht nur ich solche Packages erstellen soll/kann sondern jemand anderes auch, der aber die mainclass nicht hat, aber die Funktionen nutzen kann (wenn er das Programm mit dem anderen Konstruktor aufruft)


Und änder deinen Namen auf was kürzeres!


----------



## Bleiglanz (6. Sep 2004)

> Weil nicht nur ich solche Packages erstellen soll/kann sondern jemand anderes auch, der aber die mainclass nicht hat, aber die Funktionen nutzen kann (wenn er das Programm mit dem anderen Konstruktor aufruft)


Niemand kann mit deinen Packages was anfangen, wenn er nicht die kompilierten Binaries hat (im allgemeinen ein jar-Archiv). Ich weiss zwar überhaupt nicht, was du meinst, aber mit Class.ForName und reflect Method invoke kannst du das machen


----------



## Beni (6. Sep 2004)

@the_29
Mammut hat wohl recht, der Compiler benötigt _alle_ Infos um richtig zu funktionieren (Was ist wenn du ein Schreibfehler machst, der Compiler würde es nicht bemerken und dein Progi könnte starten... ziemlich gefährliche Sache).

@Mammut
Bitte etwas weniger aggressiv!


----------



## thE_29 (6. Sep 2004)

deswegen frage ich ja ob es irgendein schlüsselwort gibt, mit dem man solche Variablen vereinbaren kann!

das es einfach so net gehen ist klar und ist auch gut so


----------



## Bleiglanz (6. Sep 2004)

thE_29 hat gesagt.:
			
		

> deswegen frage ich ja ob es irgendein schlüsselwort gibt, mit dem man solche Variablen vereinbaren kann!
> 
> das es einfach so net gehen ist klar und ist auch gut so



Was heisst schon Schlüsselwort, dazu gehört eine kleine Wissenschaft namens Reflection


```
String klasse = "java.lang.String";
       String methode = "length";
       Class dynaclass = Class.forName(klasse);
       Constructor konst = dynaclass.getConstructor(new Class[]{String.class});
       Object dynaobject = konst.newInstance(new Object[]{"Hallo Welt"});
       Method dynameth = dynaclass.getMethod(methode,null);
       System.out.println(dynameth.invoke(dynaobject,null));
```


----------



## meez (6. Sep 2004)

Das impliziert aber, dass du die Klasse schon im Klassenpfad....
Wenn nicht, musst du noch den Classloader setzten...


----------



## Bleiglanz (6. Sep 2004)

zumindest kann man übersetzen, ohne die Klasse im Classpath zu haben...


----------



## thE_29 (6. Sep 2004)

jo, mit reflection kenn ich mich eh aus 
meine meistens programme bauen auf, indem sie nicht wissen was ihr "kind" ist, nur hatten sie halt immer die imports, aber so könnte es gehen!

werd mich morgen rumspielen,jedenfalls bleiglanz danke für die Inspiration  (weil so gehts net, kann ja net mainclass.class hinschreiben, würde er ja wieder mekkern!)


----------

