Skip to content

Commit 9aa29e2

Browse files
author
jossonsmith
committed
Implement Java's reflection.
Add some necessary *Error or *Exception Add support of Locale
1 parent d6d20ab commit 9aa29e2

27 files changed

Lines changed: 5364 additions & 28 deletions

sources/net.sf.j2s.java.core/.j2s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#Java2Script Configuration
2-
#Sun Jul 16 14:25:43 CST 2006
2+
#Wed Jul 26 00:58:17 CST 2006
33
j2s.compiler.visitor=SWTScriptVisitor
44
j2s.abandoned.resources.list=bin/net/sf/j2s/java/core/CorePlugin.js,bin/net/sf/j2s/java/core/RegExCompress.js,bin/net/sf/j2s/java/core/Bundle2StringUtil.js
55
j2s.compiler.abbreviation=true
66
j2s.compiler.dependency.status=disable
77
j2s.compiler.status=enable
88
j2s.compiler.abbreviation.prefix=$_
99
j2s.compiler.mode=debug
10-
j2s.resources.list=bin/java/lang/Runnable.js,bin/java/lang/Cloneable.js,bin/java/io/Serializable.js,bin/java/lang/Comparable.js,bin/java/lang/CharSequence.js,bin/java/lang/StringBuffer.js,bin/java/util/Comparator.js,bin/java/util/Iterator.js,bin/java/util/ListIterator.js,bin/java/util/Enumeration.js,bin/java/util/Collection.js,bin/java/util/Set.js,bin/java/util/Map.js,bin/java/util/List.js,bin/java/util/RandomAccess.js,bin/java/util/AbstractCollection.js,bin/java/util/AbstractSet.js,bin/java/util/AbstractMap.js,bin/java/util/AbstractList.js,bin/java/util/ArrayList.js,bin/java/util/HashMap.js,bin/java/util/HashSet.js,bin/java/util/Dictionary.js,bin/java/util/Hashtable.js,bin/java/util/Properties.js,bin/java/util/Vector.js,bin/java/util/Stack.js,bin/java/lang/Throwable.js,bin/java/lang/Error.js,bin/java/lang/Exception.js,bin/java/lang/RuntimeException.js,bin/java/lang/NullPointerException.js,bin/java/lang/IllegalArgumentException.js,bin/java/lang/NoSuchMethodException.js,bin/java/util/EventObject.js,bin/java/util/EventListener.js,bin/java/util/EventListenerProxy.js,bin/java/util/ResourceBundle.js,bin/java/lang/ThreadGroup.js,bin/java/lang/Thread.js,bin/java/lang/StackTraceElement.js,bin/java/io/InputStream.js,bin/java/util/MissingResourceException.js
10+
j2s.resources.list=bin/java/lang/Runnable.js,bin/java/lang/Cloneable.js,bin/java/io/Serializable.js,bin/java/lang/Comparable.js,bin/java/lang/CharSequence.js,bin/java/lang/StringBuffer.js,bin/java/util/Comparator.js,bin/java/util/Iterator.js,bin/java/util/ListIterator.js,bin/java/util/Enumeration.js,bin/java/util/Collection.js,bin/java/util/Set.js,bin/java/util/Map.js,bin/java/util/List.js,bin/java/util/RandomAccess.js,bin/java/util/AbstractCollection.js,bin/java/util/AbstractSet.js,bin/java/util/AbstractMap.js,bin/java/util/AbstractList.js,bin/java/util/ArrayList.js,bin/java/util/HashMap.js,bin/java/util/HashSet.js,bin/java/util/Dictionary.js,bin/java/util/Hashtable.js,bin/java/util/Properties.js,bin/java/util/Vector.js,bin/java/util/Stack.js,bin/java/lang/Throwable.js,bin/java/lang/Error.js,bin/java/lang/Exception.js,bin/java/lang/RuntimeException.js,bin/java/lang/NullPointerException.js,bin/java/lang/IllegalArgumentException.js,bin/java/lang/NoSuchMethodException.js,bin/java/util/EventObject.js,bin/java/util/EventListener.js,bin/java/util/EventListenerProxy.js,bin/java/util/ResourceBundle.js,bin/java/lang/ThreadGroup.js,bin/java/lang/Thread.js,bin/java/lang/StackTraceElement.js,bin/java/io/InputStream.js,bin/java/util/MissingResourceException.js,bin/java/lang/ThreadDeath.js,bin/java/lang/reflect/Modifier.js,bin/java/lang/reflect/AccessibleObject.js,bin/java/lang/reflect/Array.js,bin/java/lang/reflect/Constructor.js,bin/java/lang/reflect/Field.js,bin/java/lang/reflect/InvocationHandler.js,bin/java/lang/reflect/InvocationTargetException.js,bin/java/lang/reflect/Member.js,bin/java/lang/reflect/Method.js,bin/java/lang/reflect/Proxy.js,bin/java/lang/reflect/ReflectAccess.js,bin/java/lang/reflect/ReflectPermission.js,bin/java/lang/reflect/UndeclaredThrowableException.js,bin/java/lang/Void.js,bin/java/lang/IndexOutOfBoundsException.js,bin/java/lang/StringIndexOutOfBoundsException.js,bin/java/io/UnsupportedEncodingException.js,bin/java/lang/NumberFormatException.js,bin/java/util/Locale.js
1111
j2s.compiler.whitespace=false
1212
j2s.output.path=bin
1313
j2s.compiler.linebreak=\r\n

sources/net.sf.j2s.java.core/j2score/Class.js

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
function Clazz () {
4141
};
4242

43+
Class = Clazz;
44+
4345
function NullObject () {
4446
};
4547

@@ -66,6 +68,9 @@ Clazz.getClassName = function (clazzHost) {
6668
if (typeof clazzHost == "function") {
6769
var clazz = clazzHost;
6870
if (clazz.__CLASS_NAME__ != null) {
71+
if (arguments[1] != true) {
72+
return "Class";
73+
}
6974
/* user defined class name */
7075
return clazz.__CLASS_NAME__;
7176
}
@@ -121,14 +126,14 @@ Clazz.getClassName = function (clazzHost) {
121126
return "Array";
122127
}
123128
}
124-
return Clazz.getClassName (obj.constructor);
129+
return Clazz.getClassName (obj.constructor, true);
125130
}
126131
} else if (objType == "number") {
127132
return "Number";
128133
} else if (objType == "boolean") {
129134
return "Boolean";
130135
}
131-
return Clazz.getClassName (obj.constructor);
136+
return Clazz.getClassName (obj.constructor, true);
132137
}
133138
}
134139
};
@@ -600,7 +605,7 @@ Clazz.CastedNull = function (asClazz) {
600605
if (asClazz instanceof String) {
601606
this.clazzName = asClazz;
602607
} else if (asClazz instanceof Function) {
603-
this.clazzName = Clazz.getClassName (asClazz);
608+
this.clazzName = Clazz.getClassName (asClazz, true);
604609
} else {
605610
this.clazzName = "" + asClazz;
606611
}
@@ -648,7 +653,7 @@ Clazz.MethodNotFoundException = function () {
648653
};
649654

650655
/* private */
651-
/*-# getParamsType -> gPT #-*/
656+
/*x-# getParamsType -> gPT #-x*/
652657
Clazz.getParamsType = function (funParams) {
653658
var params = new Array ();
654659
params.hasCastedNull = false;
@@ -1459,7 +1464,7 @@ Clazz.instantialize = function (objThis, args) {
14591464
/* protected */
14601465
/*-# innerFunctionNames -> iFN #-*/
14611466
Clazz.innerFunctionNames = [
1462-
"equals", "getName" /*# {$no.javascript.support} >>x #*/, "defineMethod", "defineStaticMethod",
1467+
"equals", "getName", "getResourceAsStream" /*# {$no.javascript.support} >>x #*/, "defineMethod", "defineStaticMethod",
14631468
"makeConstructor" /*# x<< #*/
14641469
];
14651470

@@ -1479,7 +1484,7 @@ Clazz.innerFunctions = {
14791484
* Similar to Class#getName
14801485
*/
14811486
getName : function () {
1482-
return Clazz.getClassName (this);
1487+
return Clazz.getClassName (this, true);
14831488
},
14841489

14851490
getResourceAsStream : function (name) {
@@ -1588,9 +1593,16 @@ Clazz.decorateFunction = function (clazzFun, prefix, name) {
15881593
}
15891594
clazzFun.__CLASS_NAME__ = qName;
15901595
clazzFun.prototype.__CLASS_NAME__ = qName;
1596+
/*
15911597
clazzFun.equals = Clazz.innerFunctions.equals;
15921598
clazzFun.getName = Clazz.innerFunctions.getName;
15931599
clazzFun.getResourceAsStream = Clazz.innerFunctions.getResourceAsStream;
1600+
*/
1601+
var inF = Clazz.innerFunctionNames;
1602+
for (var i = 0; i < inF.length; i++) {
1603+
clazzFun[inF[i]] = Clazz.innerFunctions[inF[i]];
1604+
}
1605+
15941606
};
15951607

15961608
/* proected */
@@ -1651,4 +1663,7 @@ Clazz.decorateAsType = function (clazzFun, qClazzName, clazzParent,
16511663
};
16521664

16531665
Clazz.declarePackage ("java.lang");
1666+
java.lang.ClassLoader = {
1667+
__CLASS_NAME__ : "ClassLoader"
1668+
};
16541669

sources/net.sf.j2s.java.core/j2score/ClassExt.js

Lines changed: 107 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ Clazz.MethodNotFoundException = function (obj, clazz, method, params) {
4141
} else {
4242
leadingStr = "Constructor";
4343
}
44-
this.message = leadingStr + " " + Clazz.getClassName (clazz) + "."
44+
this.message = leadingStr + " " + Clazz.getClassName (clazz, true) + "."
4545
+ method + "(" + paramStr + ") is not found!";
4646
this.toString = function () {
4747
return "MethodNotFoundException:" + this.message;
@@ -69,15 +69,15 @@ Clazz.prepareCallback = function (objThis, args) {
6969
obs = new Array ();
7070
objThis[cbName] = obs;
7171
}
72-
var className = Clazz.getClassName (classThisObj);
72+
var className = Clazz.getClassName (classThisObj, true);
7373
//if (obs[className] == null) { /* == null make no sense! */
7474
//obs[className] = classThisObj;
7575
obs[className.replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;
7676
var clazz = Clazz.getClass (classThisObj);
7777
while (clazz.superClazz != null) {
7878
clazz = clazz.superClazz;
7979
//obs[Clazz.getClassName (clazz)] = classThisObj;
80-
obs[Clazz.getClassName (clazz)
80+
obs[Clazz.getClassName (clazz, true)
8181
.replace (/org\.eclipse\.swt\./, "$wt.")] = classThisObj;
8282
}
8383
//}
@@ -588,7 +588,12 @@ Object.prototype.getClass = function () {
588588
};
589589

590590
Object.prototype.clone = function () {
591-
return this;
591+
var o = new Object ();
592+
for (var i in this) {
593+
o[i] = this[i];
594+
}
595+
return o;
596+
//return this;
592597
};
593598

594599
/*
@@ -611,15 +616,27 @@ w$ = window; // Short for browser's window object
611616
d$ = document; // Short for browser's document object
612617
System = {
613618
out : {
619+
__CLASS_NAME__ : "java.io.PrintStream",
614620
print : function () {},
615621
printf : function () {},
616622
println : function () {}
617623
},
618624
err : {
625+
__CLASS_NAME__ : "java.io.PrintStream",
619626
print : function () {},
620627
printf : function () {},
621628
println : function () {}
622629
},
630+
currentTimeMillis : function () {
631+
return new Date ().getTime ();
632+
},
633+
props : null, //new java.util.Properties (),
634+
getProperties : function () {
635+
return System.props;
636+
},
637+
setProperties : function (props) {
638+
System.props = props;
639+
},
623640
arraycopy : function (src, srcPos, dest, destPos, length) {
624641
for (var i = 0; i < length; i++) {
625642
dest[destPos + i] = src[srcPos + i];
@@ -637,3 +654,89 @@ Thread.currentThread = Thread.prototype.currentThread = function () {
637654

638655
$_J=Clazz.declarePackage;$_C=Clazz.decorateAsClass;$_Z=Clazz.instantialize;$_I=Clazz.declareInterface;$_D=Clazz.isClassDefined;$_H=Clazz.pu$h;$_P=Clazz.p0p;$_B=Clazz.prepareCallback;$_N=Clazz.innerTypeInstance;$_K=Clazz.makeConstructor;$_U=Clazz.superCall;$_R=Clazz.superConstructor;$_M=Clazz.defineMethod;$_V=Clazz.overrideMethod;$_S=Clazz.defineStatics;$_E=Clazz.defineEnumConstant;$_F=Clazz.cloneFinals;$_Y=Clazz.prepareFields;$_A=Clazz.newArray;$_O=Clazz.instanceOf;$_G=Clazz.inheritArgs;$_X=Clazz.checkPrivateMethod;$_Q=Clazz.makeFunction;
639656

657+
var reflect = Clazz.declarePackage ("java.lang.reflect");
658+
Clazz.declarePackage ("java.security");
659+
660+
Clazz.innerFunctionNames = Clazz.innerFunctionNames.concat (["getSuperclass",
661+
"isAssignableFrom", "getMethods", "getMethod", "getDeclaredMethods",
662+
"getDeclaredMethod", "getConstructor", "getModifiers", "isArray", "newInstance"]);
663+
664+
Clazz.innerFunctions.getSuperclass = function () {
665+
return this.superClazz;
666+
};
667+
Clazz.innerFunctions.isAssignableFrom = function (clazz) {
668+
return Clazz.getInheritedLevel (clazz, this) >= 0;
669+
};
670+
Clazz.innerFunctions.getConstructor = function () {
671+
return new java.lang.reflect.Constructor (this, [], [],
672+
java.lang.reflect.Modifier.PUBLIC, 0);
673+
};
674+
Clazz.innerFunctions.getDeclaredMethods = Clazz.innerFunctions.getMethods = function () {
675+
var ms = new Array ();
676+
var p = this.prototype;
677+
for (var attr in p) {
678+
if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {
679+
/* there are polynormical methods. */
680+
ms[ms.length] = new java.lang.reflect.Method (this, attr,
681+
[], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC, 0);
682+
}
683+
}
684+
p = this;
685+
for (var attr in p) {
686+
if (typeof p[attr] == "function" && p[attr].__CLASS_NAME__ == null) {
687+
ms[ms.length] = new java.lang.reflect.Method (this, attr,
688+
[], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC
689+
| java.lang.reflect.Modifier.STATIC, 0);
690+
}
691+
}
692+
return ms;
693+
};
694+
Clazz.innerFunctions.getDeclaredMethod = Clazz.innerFunctions.getMethod = function (name, clazzes) {
695+
var p = this.prototype;
696+
for (var attr in p) {
697+
if (name == attr && typeof p[attr] == "function"
698+
&& p[attr].__CLASS_NAME__ == null) {
699+
/* there are polynormical methods. */
700+
return new java.lang.reflect.Method (this, attr,
701+
[], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC, 0);
702+
}
703+
}
704+
p = this;
705+
for (var attr in p) {
706+
if (name == attr && typeof p[attr] == "function"
707+
&& p[attr].__CLASS_NAME__ == null) {
708+
return new java.lang.reflect.Method (this, attr,
709+
[], java.lang.Void, [], java.lang.reflect.Modifier.PUBLIC
710+
| java.lang.reflect.Modifier.STATIC, 0);
711+
}
712+
}
713+
return null;
714+
};
715+
Clazz.innerFunctions.getModifiers = function () {
716+
return java.lang.reflect.Modifier.PUBLIC;
717+
};
718+
Clazz.innerFunctions.isArray = function () {
719+
return false;
720+
};
721+
Clazz.innerFunctions.newInstance = function () {
722+
var clz = this;
723+
return new clz ();
724+
};
725+
726+
//Object.newInstance = Clazz.innerFunctions.newInstance;
727+
{
728+
var inF = Clazz.innerFunctionNames;
729+
for (var i = 0; i < inF.length; i++) {
730+
Object[inF[i]] = Clazz.innerFunctions[inF[i]];
731+
}
732+
}
733+
734+
Clazz.forName = function (clazzName) {
735+
if (window["ClazzLoader"] != null) {
736+
ClazzLoader.setLoadingMode ("xhr.sync");
737+
ClazzLoader.loadClass (clazzName);
738+
return Clazz.evalType (clazzName);
739+
} else {
740+
alert ("[Java2Script] Error: No ClassLoader!");
741+
}
742+
};

sources/net.sf.j2s.java.core/j2score/ClassLoader.js

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
* Give more ways for the feedback of loading.
2323
* Use multiple SCRIPT tags so *.js can be downloaded asynchronously.
2424
* Use Class.for.... to load tabs.
25+
*
26+
* Fix the bug that *.random are used to identify visited status.
27+
* Determine whether *.js is sucessfully loaded or failed.
2528
*/
2629

2730
/*-#
@@ -83,7 +86,7 @@ ClazzNode.STATUS_OPTIONALS_LOADED = 5;
8386
/**
8487
* Static class loader class
8588
*/
86-
ClazzLoader = {};
89+
ClazzLoader = function () {};
8790

8891
/**
8992
* Class dependency tree
@@ -307,7 +310,7 @@ ClazzLoader.classQueue = new Array ();
307310
ClazzLoader.classpathMap = new Object ();
308311

309312
/* public */
310-
ClazzLoader.packageClassPath = function (pkg, base) {
313+
ClazzLoader.packageClasspath = function (pkg, base) {
311314
if (pkg.lastIndexOf (".*") == pkg.length - 2) {
312315
pkg = pkg.substring (0, pkg.length - 2);
313316
}
@@ -341,7 +344,7 @@ ClazzLoader.libraryClasspath = function (prefix, pkgs, base, index) {
341344
}
342345
ClazzLoader[isRegistered] = true;
343346
for (var i = 0; i < pkgs.length; i++) {
344-
ClazzLoader.packageClassPath (prefix + pkgs[i], base);
347+
ClazzLoader.packageClasspath (prefix + pkgs[i], base);
345348
}
346349
if (index == true && window[prefix + "package"] != true) {
347350
ClazzLoader.loadClass (prefix + "package");
@@ -383,6 +386,21 @@ ClazzLoader.swtClasspath = function (base) {
383386
], base, true);
384387
};
385388

389+
390+
/* public */
391+
ClazzLoader.junitClasspath = function (base) {
392+
ClazzLoader.libraryClasspath ("junit.", [
393+
"*",
394+
"awtui.*",
395+
"extensions.*",
396+
"framework.*",
397+
"runner.*",
398+
"swingui.*",
399+
"textui.*"
400+
], base, false);
401+
};
402+
403+
386404
/* public */
387405
ClazzLoader.ajaxClasspath = function (base) {
388406
ClazzLoader.libraryClasspath ("net.sf.j2s.ajax.", ["*"], base, false);
@@ -397,6 +415,7 @@ ClazzLoader.j2slibClasspath = function (base) {
397415
ClazzLoader.runtimeClasspath (base);
398416
ClazzLoader.swtClasspath (base);
399417
ClazzLoader.ajaxClasspath (base);
418+
ClazzLoader.junitClasspath (base);
400419
};
401420

402421
/**
@@ -1324,6 +1343,9 @@ ClazzLoader.queueBeforeString = new Array ();
13241343
*/
13251344
/* public */
13261345
ClazzLoader.loadClass = function (name, optionalsLoaded) {
1346+
if (typeof optionalsLoaded == "boolean") {
1347+
return Clazz.evalType (name);
1348+
}
13271349
ClazzLoader.keepOnLoading = true;
13281350
if (!ClazzLoader.isClassDefined ("java.lang.String")
13291351
&& name.indexOf ("java.") != 0) {
@@ -1343,7 +1365,7 @@ ClazzLoader.loadClass = function (name, optionalsLoaded) {
13431365
n.status = ClazzNode.STATUS_KNOWN;
13441366
/*-# needBeingQueued -> nQ #-*/
13451367
var needBeingQueued = false;
1346-
for (var i = ClazzLoader.classQueue.length - 1; i >= 0; i++) {
1368+
for (var i = ClazzLoader.classQueue.length - 1; i >= 0; i--) {
13471369
var cq = ClazzLoader.classQueue[i];
13481370
if (cq.status != ClazzNode.STATUS_OPTIONALS_LOADED) {
13491371
needBeingQueued = true;
@@ -1397,3 +1419,5 @@ ClazzLoader.addChildClassNode = function (parent, child, type) {
13971419
}
13981420
};
13991421

1422+
ClassLoader = ClazzLoader;
1423+

0 commit comments

Comments
 (0)