# Reflection performant?



## Xams (11. Apr 2007)

Ich hab folgendes Problem:
In meinem Spiel Sulk will ich die KI austauschbar machen (für einen KI Wettbewerb ala TutorVolley), das geht so viel ich weiß nur mit Reflection. Das Problem ist nur das Reflection um einiges langsamer ist als wenn die Klasse bekannt ist. da ich auch 3dGraphik einbauen will, weiß ich nicht ob dann noch Reflection möglich ist ohne das die Performance leidet. JPCT ist nicht grade CPU schonend. Gibt es andere möglichkeiten um Die KI einzubinden.
MFG


----------



## Wildcard (11. Apr 2007)

Die Reflection Problematik hast du nur beim Laden und Instanzieren der Klasse(n).
Danach sprichst du das Objekt mit dem Interface an und es macht keinen Unterschied mehr wo es denn nun her kommt.


----------



## Marco13 (11. Apr 2007)

Öhm - warum eigentlich Reflection? Reicht es nicht, wenn du ein Interface hast, und dafür dann einfach verschiedene Implementierungen anbietest?


----------



## Wildcard (11. Apr 2007)

Marco13 hat gesagt.:
			
		

> Öhm - warum eigentlich Reflection? Reicht es nicht, wenn du ein Interface hast, und dafür dann einfach verschiedene Implementierungen anbietest?


Naja, wenn jeder einfach eine KI in ein Verzeichnis werfen kann dann muss schon Reflection her.


----------



## Marco13 (11. Apr 2007)

Ah OK - es soll also nach einer Änderung der KI (oder dem Hinzufügen einer neuen) kein neucomplilieren nötig sein ... hätte jetzt gedacht, dass das auch ohne Reflection irgendwie über den ClassLoader geht, aber genau hab ich mir das noch nicht angesehen...


----------



## ps2aich (20. Apr 2007)

Marco13 hat gesagt.:
			
		

> Ah OK - es soll also nach einer Änderung der KI (oder dem Hinzufügen einer neuen) kein neucomplilieren nötig sein ... hätte jetzt gedacht, dass das auch ohne Reflection irgendwie über den ClassLoader geht, aber genau hab ich mir das noch nicht angesehen...



Mit einem Interface geht es ohne Reflektion. 

Die Plugins (oder KI -Klassen) lädt man über z.B. über den URLClassloader,

ala

```
URL[] urls = new URL[] {"file://c:\\mypath\\myjar.jar"};
URLClassloader classLoader = URLClassLoader.newInstance(urls);

MyInterface myInterface = (MyInterface) classLoader.loadClass("com.myCompany.myPackage.MyKIImplentation");
```

Wie man an dem Beispiel sieht, muss der voll qualifizierte Name der Klasse bekannt sein,
das kann man entweder über Konvention lösen ("Die KI-Klasse muss thunder.ki.KIImpl heissen"),
oder man schaut vorher in das Jar rein (d.h. iteriert über die Dateien) und lädt
sie und testet sie auf das Interface (instanceof)

```
JarFile jar = new JarFile("c:/mypath/myjar.jar");
Enumeration<JarEntry> jarEntries = jar.entries(); 
JarEntry jarEntry = null;
for (; jarEntries.hasMoreElements();){
    jarEntry = (JarEntry)jarEntries.nextElement();
    if(!jarEntry.isDirectory())
      // do something with jarEntry.getName();
}
```

Wenn sich das Interface ändert, müssen auch die KIs neu kompiliert werden.
Um das zu vermeiden, kann mein ein lose gekoppeltes Interface verwenden,
das generische Strukturen für die API verwendet:
Anstelle

```
public int compute(int argumentA, int argumentA,boolean someCondition);
```
wird das Interface so definiert:

```
public IResult compute(Map arguments,IContext context);
```


----------



## Wildcard (20. Apr 2007)

ps2aich hat gesagt.:
			
		

> Mit einem Interface geht es ohne Reflektion.


ClassLoader#loadClass liefert ein Class Objekt.
Dieses muss anschließend über die Reflection-API instanziert werden   :wink:


----------



## ps2aich (22. Apr 2007)

Wildcard hat gesagt.:
			
		

> ps2aich hat gesagt.:
> 
> 
> 
> ...



Aeh, ja, du hast recht, da habe ich einen Schritt ausgelassen, instanziieren sollte man die implementierende
Klasse natürlich noch   


```
URL[] urls = new URL[] {"file://c:\\mypath\\myjar.jar"};
URLClassloader classLoader = URLClassLoader.newInstance(urls);

Class myClass =classLoader.loadClass("com.myCompany.myPackage.MyKIImplentation");
MyInterface myInstance = (MyInterface) myClass.newInstance() ;
```

Oder man benutzt Reflektion mit der 'Constructor'-Klasse, falls man Argumente im Constructor hat.

Und wenn man das Jar durchläuft, braucht man natürlich nicht 'instanceof', sondern
die 'isAssignableFrom'-Methode.

Das kommt davon, wenn man dauernd die Meta-Ebenen wechselt .....


----------



## Gast (4. Jul 2007)

Hallo kann mir  bitte jemanden  dieses quellcode einbischen erlaütern was könnte mit gewichte gemeint sein))das ist ein damespielublic class EinfacheKI extends BasisKI {

    public EinfacheKI(int ich, int gegner) {
        super(ich, gegner);
    }

    // bigger weight means worse move

    protected float gewichtZug(Daten brett) {
        float gewicht = 0;

        Metric metric = brett.getMetric();

        Zug[] advMoves = brett.getZugelasseneZuege(gegner);

       if (advMoves == null || advMoves.length == 0) {
            // this is a win, don't worry about anything else
            // just return the lowest possible so the move is made
            return -100;

          }

        for (int i = 0; i < advMoves.length; i++) {
//          if (advMoves_.isJump()) {
////               // add three points for every jump that the
////////               // gegner has as an option
//              gewicht += 3;
//
                Zug[] jumps = brett.getLegalJumpsVon(gegner,
                        advMoves.getToReihe(), advMoves.getToSpalte());
                if (jumps != null) {

             // add three points for every jump 
                    // after the first jump
                   gewicht += jumps.length * 3;
}
            //}
        }
//        
        // add one point for every piece the adversay has
        gewicht += metric.getSteine(gegner);

        // add two points for every kings the gegner has
        gewicht += metric.getDamen(gegner) * 2;

        // subtract one point for every king of yours
       gewicht -= metric.getDamen(ich);




        return gewicht;
    }

}_


----------



## SlaterB (4. Jul 2007)

steht doch im Quelltext, ein Bewertung der Spielsituation,
je höher desto schlechter,
je höher z.B. für jeden Zug der dem Gegner noch möglich ist


----------



## Gast (4. Jul 2007)

ich habe es übersehen ,das stimmt .danke


----------



## Gast (8. Jul 2007)

Bitte löschen Crosspost (Der Beitrag  steht auch im JPCT-Tutorial)


----------

