Reflection performant?

Status
Nicht offen für weitere Antworten.

Xams

Bekanntes Mitglied
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

Top Contributor
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

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

Wildcard

Top Contributor
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

Top Contributor
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

Mitglied
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
Code:
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)
Code:
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
Code:
 public int compute(int argumentA, int argumentA,boolean someCondition);
wird das Interface so definiert:
Code:
public IResult compute(Map arguments,IContext context);
 

ps2aich

Mitglied
Wildcard hat gesagt.:
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:

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

Code:
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 .....
 
G

Gast

Gast
Hallo kann mir bitte jemanden dieses quellcode einbischen erlaütern :(was könnte mit gewichte gemeint sein))das ist ein damespiel:public 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;
}

}
 
S

SlaterB

Gast
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
 
G

Gast

Gast
Bitte löschen Crosspost (Der Beitrag steht auch im JPCT-Tutorial)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Reflection gone wrong? Allgemeine Java-Themen 21
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
J Reflection Aufruf: .class durch .dll ersetzen Allgemeine Java-Themen 4
T Reflection - Abprüfen von Klasseneigenschaften Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
J Reflection-Method Hook? Allgemeine Java-Themen 14
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
X public Getter ersetzen (Reflection?!) Allgemeine Java-Themen 3
A Reflection Problem Allgemeine Java-Themen 15
K Generic class und Reflection Allgemeine Java-Themen 2
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
N Per Reflection auf (method) local inner class zugreifen? Allgemeine Java-Themen 3
E Reflection? Frage Allgemeine Java-Themen 4
B Reflection, invoke dynamisch befüllen Allgemeine Java-Themen 3
T Reflection Allgemeine Java-Themen 11
G Klassen Cast auf Argumentenklasse via Reflection? Allgemeine Java-Themen 10
H Collections Generics und Reflection Allgemeine Java-Themen 6
TheWhiteShadow Reflection-Lösung für Objektkopien Allgemeine Java-Themen 3
B Reflection: getMethods schlägt fehl (NoClassDefFoundE)) Allgemeine Java-Themen 15
P Reflection "Cast" Allgemeine Java-Themen 5
D Reflection-Performance Allgemeine Java-Themen 7
S Reflection und Generic Allgemeine Java-Themen 9
W Reflection -> getMethod bei optionalen Parametern Allgemeine Java-Themen 4
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
C Probleme mit dem Zugriff auf private Methode per reflection Allgemeine Java-Themen 2
C Zugriff auf private Methode per reflection geht nicht mehr Allgemeine Java-Themen 3
M Probleme mit Reflection Allgemeine Java-Themen 10
A Reflection Konstruktor Parameter Supertyp Allgemeine Java-Themen 2
D Vererbung, Reflection und automatischer Methodenaufruf Allgemeine Java-Themen 24
G Java Reflection Allgemeine Java-Themen 11
N Reflection: NoSuchMethodException obwohl Methode existiert Allgemeine Java-Themen 2
brunothg Problem mit Reflection Allgemeine Java-Themen 6
M reflection in inner classes Allgemeine Java-Themen 7
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
V Reflection - Field-Instanz und Annotations Allgemeine Java-Themen 6
Y Reflection und "extends" Schlüsselwort Allgemeine Java-Themen 3
R Reflection Problem Allgemeine Java-Themen 4
N getName() of reflection Object Allgemeine Java-Themen 4
P Reflection - Wie rufe ich die Felder einer Klasse in einer Methode der Basisklasse? Allgemeine Java-Themen 4
M Reflection Queue auslesen Allgemeine Java-Themen 6
N generic reflection Allgemeine Java-Themen 5
megachucky Java Reflection -> versteckte Felder finden? Allgemeine Java-Themen 3
MQue Reflection Exception Allgemeine Java-Themen 11
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
ruutaiokwu Per Reflection membervariablen überschreiben / zuweisen / nullen Allgemeine Java-Themen 5
T Zugriff per Reflection o.ä. möglich? Allgemeine Java-Themen 18
R Reflection: Membervariablen-Initialwerte Allgemeine Java-Themen 4
G Reflection Allgemeine Java-Themen 6
V reflection in java 5 und 6 Allgemeine Java-Themen 2
C Reflection Übergabeparamter überprüfen? Allgemeine Java-Themen 3
Ark Konstruktor per Reflection nicht bekannt Allgemeine Java-Themen 4
Q Objekte durch Reflection erzeugen Allgemeine Java-Themen 18
G [Reflection + WebService] Methodenaufruf an einem Proxy Allgemeine Java-Themen 11
T Parameternamen mit Reflection-API Allgemeine Java-Themen 14
M reflection mit parametern Allgemeine Java-Themen 8
M Reflection Frage Allgemeine Java-Themen 7
G Code vereinfachen bei Reflection Allgemeine Java-Themen 4
I reflection get inner static classes Allgemeine Java-Themen 2
C Reflection Allgemeine Java-Themen 12
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
Y Reflection - wie anwenden/benutzen bei folgendem Problem Allgemeine Java-Themen 3
P Java Reflection API - ResultDataModel ? Allgemeine Java-Themen 3
R Object Dynamisch erzeugen (Reflection API) Allgemeine Java-Themen 22
N Design-Frage: persistent machen per Reflection Allgemeine Java-Themen 3
G Reflection: aktuelle bzw umschliessende Methode? Allgemeine Java-Themen 7
G per Reflection auf private Klassenattribute zugreifen? Allgemeine Java-Themen 9
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
M per reflection private attributsnamen auslesen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
C Reflection Problem! Allgemeine Java-Themen 2
G Object cast via Reflection Allgemeine Java-Themen 8
T Reflection und Typsicherheit Allgemeine Java-Themen 5
Q Umgang mit Reflection Allgemeine Java-Themen 4
S reflection Allgemeine Java-Themen 12
M Reflection und Serializable Allgemeine Java-Themen 5
A Reflection - Variablen innerhalb einer Methode ermitteln Allgemeine Java-Themen 9
F Performance von Reflection vs Statisches Coden Allgemeine Java-Themen 4
the[V]oid Primitive Arrays per Reflection erzeugen? Allgemeine Java-Themen 2
W Package via Reflection parsen Allgemeine Java-Themen 4
R Interface mittels Reflection implementieren Allgemeine Java-Themen 8
M reflection Integer != int ? Allgemeine Java-Themen 3
M reflection invoce Allgemeine Java-Themen 3
K Reflection:Zugriff auf innere Klassen Allgemeine Java-Themen 4
N NoSuchMethodException bei Reflection-Versuch, aber warum? Allgemeine Java-Themen 3
byte Methodenaufruf per Reflection? Allgemeine Java-Themen 2
M Generics und Reflection Allgemeine Java-Themen 3
M Array per Reflection manipulieren Allgemeine Java-Themen 5
M Klassen von ausserhalb des Jars per Reflection nachladen Allgemeine Java-Themen 2
thE_29 Reflection Allgemeine Java-Themen 6
M statische Methode per reflection aufrufen Allgemeine Java-Themen 2
B Frage zu Reflection Allgemeine Java-Themen 3
V Reflection - Problem Allgemeine Java-Themen 3
clemson Reflection Interface Allgemeine Java-Themen 4
G mit reflection an die felder einer klasse rankommen Allgemeine Java-Themen 4
N Reflection: An Package einer .class-Datei kommen Allgemeine Java-Themen 2
N Reflection: Feststellen ob eine Klasse abstract ist Allgemeine Java-Themen 3
B Reflection Allgemeine Java-Themen 10
C Reflection und variable casten ! Allgemeine Java-Themen 10
C Reflection - Kurze Beschreibung? Allgemeine Java-Themen 3
F Frage zum Thema Reflection Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben