Search the FirstSpirit Knowledge Base
Hallo Community,
ich habe das folgendes Beanshell-Problem, es lassen kleine sebst definierten classen in ein Beanshell-Script verwenden.
die Fehlermelgung ist die foldende,
Target exception: bsh.InterpreterError: unable to get instance initializer: bsh.UtilTargetError: Security Exception while searching fields of: class MyClass
hat es jemand gelöst ?
Danke und Grüße
Ich würde raten, keine Klassen über Beanshell zu erzeugen. Beanshell ist eine Skriptsprache und die Erzeugung von Klassen ist dort mehr eine Notlösung.
Es gibt aber alternative Ansätze, der ähnlich wie JavaScript-Prototypen funktioniert. Hier mal dein Beispiel darauf umgeschrieben:
MyClass(param) {
attribute;
doSomething() {
print("hello " + attribute + "!");
}
attribute = param;
return this; // fixed
}
o = MyClass("a");
o.doSomething();
Korrektur: Fehlendes "return this" ergänzt.
Es könnte sein, das es am Skript liegt. Bitte mal kontrollieren, ob da korrekte Methoden-Namen verwendet werden bzw. ob die angesprochenen Felder und Methoden zugreifbar sind (als "public" definiert).
Wenn das nicht weiterhilft wäre der Trace hilfreich, ich hab 'nen guten Draht zum BeanShell-Maintainer
Hier der Script,
erstaunlicherweise passiert es in einem Projekt und in andere Projekt nicht. Zusätzlichen Modulen habe ich deinstalliert.
Hier der Snippet
public class myClass {
public Object attribute;
public myClass(Object param){ this.attribute = param; }
}
o = new myClass("a");
hier die Trace
bsh % // Error: // Uncaught Exception: Object constructor : at Line: 1 : in file: <unknown file> : new myClass ( "a" )
Target exception: bsh.InterpreterError: unable to get instance initializer: bsh.UtilTargetError: Security Exception while searching fields of: class myClass
bsh.InterpreterError: unable to get instance initializer: bsh.UtilTargetError: Security Exception while searching fields of: class myClass
at bsh.ClassGeneratorUtil.getConstructorArgs(Unknown Source)
at myClass.<init>(BeanShell Generated via ASM (www.objectweb.org))
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at bsh.Reflect.constructObject(Unknown Source)
at bsh.BSHAllocationExpression.constructObject(Unknown Source)
at bsh.BSHAllocationExpression.objectAllocation(Unknown Source)
at bsh.BSHAllocationExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHPrimaryExpression.eval(Unknown Source)
at bsh.BSHAssignment.eval(Unknown Source)
at bsh.Interpreter.run(Unknown Source)
at java.lang.Thread.run(Unknown Sourcebsh % )
Dake und Grüße.
Ich würde raten, keine Klassen über Beanshell zu erzeugen. Beanshell ist eine Skriptsprache und die Erzeugung von Klassen ist dort mehr eine Notlösung.
Es gibt aber alternative Ansätze, der ähnlich wie JavaScript-Prototypen funktioniert. Hier mal dein Beispiel darauf umgeschrieben:
MyClass(param) {
attribute;
doSomething() {
print("hello " + attribute + "!");
}
attribute = param;
return this; // fixed
}
o = MyClass("a");
o.doSomething();
Korrektur: Fehlendes "return this" ergänzt.
es fehlt ein "return this;", aber hat es funktioniert, Danke !!!
MyClass(param) {
attribute;
doSomething() {
print("hello " + attribute + "!");
}
attribute = param;
return this;
}
o = MyClass("a");
o.doSomething();
Stimmt, das hatte ich vergessen. Habe ich ergänzt, damit nichs falsches kopiert wird. Danke!