Variabler Identifier

Status
Nicht offen für weitere Antworten.
Hallo erstmal,

ich habe mal wieder ein Problem. Ich will versuchen in BeanShell erstellte Klassen in Java nutzen zu können. Dazu lasse ich BeanShell ein Class-Array mit allen Klassen zurückgeben, die benötigt werden. In Java kann ich die dann eigentlich auch wunderbar benutzen, aber leider nicht vollständig. Bsp.: Gegeben ist das Class Objekt 'bsclass'. Dann möchte ich etwas bauen, das etwa so aussieht:

Code:
class Test {
        
        public bsclass testClass;
        
        public Test(bsclass c) {
                this.testClass = c;
        }
        
}

Das klappt so natürlich nicht. Aber wie sonst kann ich den Identifier der Klasse anpassen? Ich möchte ungerne einfach den Typ 'Object' nehmen. Geht soetwas überhaupt? Evtl. mit dem ClassLoader? Wenn ja: Wie?

Danke im Voraus.
 
Vielleicht mit Generics?
Code:
class Test<bsclass> {

        public bsclass testClass; 
        
        public Test(bsclass c) { 
                this.testClass = c; 
        }     
}

Du müsstest dann bei der Erstellung des Test-Objekts die gewünschte bsclass als Parameter übergeben:

Code:
Test <mybsclass> myTest = new Test<mybsclass>();

Vorausgesetzt dass mybsclass eine sichtbare Java-Klasse ist.
 
Klappt leider nicht. Anscheinend darf man bei Generics keine Class Objekte angeben. Ich habs etwa so versucht:

Code:
public class Main {

        public static void main(String[] args]{
                
                Interpreter i = new Interpreter();
                Class c = (Class)i.eval(new InputStreamReader(new FileInputStream("test.bsh")));
                Test<c> test = new Test<c>(c);
                
        }

}


class Test<T> {
        public T testClass;
        
        public Test(T testClass) {
                this.testClass = testClass;
        }
}

Die test.bsh könnte dann etwa so aussehen:

Code:
class BShTest {
}

return BShTest.class;


Dabei erzeugt der Compiler leider den Fehler 'Cannot find symbol: c'.
 
Ich weiß jetzt nicht ob das ganze im Zusammenhang Sinn macht, zumindest um Generics mit der Klasse als Parameter zu starten brauchst du den Namen als String, den kannst du dir mit c.class.getCanonicalName() holen.

Edit--
Code:
c.getCanonicalName()
meinte ich.
 
ich nehme mal an was du machen willst geht nicht so.

wenn du klassen die in beanshell definiert sind in java verwenden willst, dann geht das entweder per reflection oder einfach per interface. einfach das interface in beanshell implementieren lassen, dann kannst du das objekt auf das interface casten und die methoden aufrufen.

eine klasse in bsh zu schreiben und dann einfach darauf methoden aufrufen geht sonst nur via reflection
 
Ich dachte du hättest die Klassen irgendwie auch in Java zur Verfügung, deswegen schrieb ich auch "...Vorausgesetzt dass mybsclass eine sichtbare Java-Klasse ist."
Na gut, trotzdem bitte 🙂
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben