Skip to content

Commit 483c7c1

Browse files
committed
Поиск подходящего конструктора в java::new
1 parent a5c8842 commit 483c7c1

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

src/main/java/com/annimon/ownlang/modules/java/java.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.annimon.ownlang.lib.*;
44
import com.annimon.ownlang.modules.Module;
55
import java.lang.reflect.Array;
6+
import java.lang.reflect.Constructor;
67
import java.lang.reflect.Field;
78
import java.lang.reflect.InvocationTargetException;
89
import java.lang.reflect.Method;
@@ -156,17 +157,13 @@ private Value asSubclass(Value... args) {
156157
return new ClassValue(clazz.asSubclass( ((ClassValue)args[0]).clazz ));
157158
}
158159

159-
private Value isAssignableFrom(Value... args) {
160+
private Value isAssignableFrom(Value[] args) {
160161
Arguments.check(1, args.length);
161162
return NumberValue.fromBoolean(clazz.isAssignableFrom( ((ClassValue)args[0]).clazz ));
162163
}
163164

164-
private Value newInstance(Value... args) {
165-
try {
166-
return new ObjectValue(clazz.newInstance());
167-
} catch (InstantiationException | IllegalAccessException ex) {
168-
return NULL;
169-
}
165+
private Value newInstance(Value[] args) {
166+
return findConstructorAndInstantiate(args, clazz.getConstructors());
170167
}
171168

172169
private Value cast(Value... args) {
@@ -293,6 +290,21 @@ private static Value getValue(Class<?> clazz, Object object, String key) {
293290

294291
return NULL;
295292
}
293+
294+
private static Value findConstructorAndInstantiate(Value[] args, Constructor<?>[] ctors) {
295+
for (Constructor<?> ctor : ctors) {
296+
if (ctor.getParameterCount() != args.length) continue;
297+
if (!isMatch(args, ctor.getParameterTypes())) continue;
298+
try {
299+
final Object result = ctor.newInstance(valuesToObjects(args));
300+
return new ObjectValue(result);
301+
} catch (InstantiationException | IllegalAccessException
302+
| IllegalArgumentException | InvocationTargetException ex) {
303+
// skip
304+
}
305+
}
306+
return null;
307+
}
296308

297309
private static Function methodsToFunction(Object object, List<Method> methods) {
298310
return (args) -> {
@@ -312,7 +324,7 @@ private static Function methodsToFunction(Object object, List<Method> methods) {
312324
return null;
313325
};
314326
}
315-
327+
316328
private static boolean isMatch(Value[] args, Class<?>[] types) {
317329
for (int i = 0; i < args.length; i++) {
318330
final Value arg = args[i];

src/test/resources/modules/java/classes.own

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,12 @@ def testInvokeMethodSameName() {
3636
assertEquals("text", data.getText())
3737
}
3838

39+
def testNonDefaultConstructor() {
40+
StringBuilder = newClass("java.lang.StringBuilder")
41+
sb = StringBuilder.`new`("text")
42+
assertEquals("text", sb.toString())
43+
}
44+
3945

4046
def createObject() {
4147
dataClass = newClass("interop.Data")

0 commit comments

Comments
 (0)