Skip to content

Commit b5692cc

Browse files
committed
Merge JavaCall changes from zot branch
1 parent caab713 commit b5692cc

File tree

4 files changed

+69
-8
lines changed

4 files changed

+69
-8
lines changed

src/JavaCall.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ end
99

1010
export JavaObject, JavaMetaClass,
1111
jint, jlong, jbyte, jboolean, jchar, jshort, jfloat, jdouble,
12-
JObject, JClass, JMethod, JString,
12+
JObject, JClass, JMethod, JConstructor, JField, JString,
1313
@jimport, jcall, jfield, isnull,
1414
getname, getclass, listmethods, getreturntype, getparametertypes, classforname,
15+
listfields, gettype,
1516
narrow
1617

1718
# using Compat, Compat.Dates

src/convert.jl

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,26 @@ convert(::Type{Ptr{Nothing}}, obj::JavaObject{T}) where T = Ptr(obj)
33
convert(::Type{JString}, str::AbstractString) = JString(str)
44
convert(::Type{JObject}, str::AbstractString) = convert(JObject, JString(str))
55

6+
# From JProxy
7+
convert(::Type{AbstractString}, str::JString) = unsafe_string(str)
8+
convert(::Type{JavaObject{Symbol("java.lang.Double")}}, n::Real) = jnew(Symbol("java.lang.Double"), (jdouble,), Float64(n))
9+
convert(::Type{JavaObject{Symbol("java.lang.Float")}}, n::Real) = jnew(Symbol("java.lang.Float"), (jfloat,), Float32(n))
10+
convert(::Type{JavaObject{Symbol("java.lang.Long")}}, n::Real) = jnew(Symbol("java.lang.Long"), (jlong,), Int64(n))
11+
convert(::Type{JavaObject{Symbol("java.lang.Integer")}}, n::Real) = jnew(Symbol("java.lang.Integer"), (jint,), Int32(n))
12+
convert(::Type{JavaObject{Symbol("java.lang.Short")}}, n::Real) = jnew(Symbol("java.lang.Short"), (jshort,), Int16(n))
13+
convert(::Type{JavaObject{Symbol("java.lang.Byte")}}, n::Real) = jnew(Symbol("java.lang.Byte"), (jbyte,), Int8(n))
14+
convert(::Type{JavaObject{Symbol("java.lang.Character")}}, n::Real) = jnew(Symbol("java.lang.Character"), (jchar,), Char(n))
15+
convert(::Type{JavaObject{:int}}, n) = convert(jint, n)
16+
convert(::Type{JavaObject{:long}}, n) = convert(jlong, n)
17+
convert(::Type{JavaObject{:byte}}, n) = convert(jbyte, n)
18+
convert(::Type{JavaObject{:boolean}}, n) = convert(jboolean, n)
19+
convert(::Type{JavaObject{:char}}, n) = convert(jchar, n)
20+
convert(::Type{JavaObject{:short}}, n) = convert(jshort, n)
21+
convert(::Type{JavaObject{:float}}, n) = convert(jfloat, n)
22+
convert(::Type{JavaObject{:double}}, n) = convert(jdouble, n)
23+
convert(::Type{JavaObject{:void}}, n) = convert(jvoid, n)
24+
convert(::Type{JavaObject{T}}, ::Nothing) where T = jnull
25+
626
#Cast java object from S to T . Needed for polymorphic calls
727
function convert(::Type{JavaObject{T}}, obj::JavaObject{S}) where {T,S}
828
if isConvertible(T, S) #Safe static cast
@@ -91,8 +111,8 @@ end
91111
function convert_arg(argtype::Type{Array{T,1}}, arg) where T<:JavaObject
92112
carg = convert(argtype, arg)
93113
sz = length(carg)
94-
init = carg[1]
95-
arrayptr = JNI.NewObjectArray(sz, Ptr(metaclass(T)), Ptr(init))
114+
init = sz == 0 ? C_NULL : Ptr(carg[1])
115+
arrayptr = JNI.NewObjectArray(sz, Ptr(metaclass(T)), init)
96116
arrayptr === C_NULL && geterror()
97117
for i=2:sz
98118
JNI.SetObjectArrayElement(arrayptr, i-1, Ptr(carg[i]))
@@ -259,13 +279,15 @@ function convert(::Type{@jimport(java.util.List)}, x::Vector, V::Type{JavaObject
259279
end
260280

261281
# Convert a reference to a java.lang.String into a Julia string. Copies the underlying byte buffer
262-
function unsafe_string(jstr::JString) #jstr must be a jstring obtained via a JNI call
263-
if isnull(jstr); return ""; end #Return empty string to keep type stability. But this is questionable
282+
unsafe_string(jstr::JString) = unsafe_string(Ptr(jstr)) #jstr must be a jstring obtained via a JNI call
283+
284+
function unsafe_string(jstr::Ptr{Nothing}) #jstr must be a jstring obtained via a JNI call
285+
if jstr == C_NULL; return ""; end #Return empty string to keep type stability. But this is questionable
264286
pIsCopy = Array{jboolean}(undef, 1)
265287
#buf::Ptr{UInt8} = JNI.GetStringUTFChars(Ptr(jstr), pIsCopy)
266-
buf = JNI.GetStringUTFChars(Ptr(jstr), pIsCopy)
288+
buf = JNI.GetStringUTFChars(jstr, pIsCopy)
267289
s = unsafe_string(buf)
268-
JNI.ReleaseStringUTFChars(Ptr(jstr), buf)
290+
JNI.ReleaseStringUTFChars(jstr, buf)
269291
return s
270292
end
271293

src/core.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,10 +157,14 @@ isnull(obj::JavaMetaClass) = Ptr(obj) == C_NULL
157157
const JClass = JavaObject{Symbol("java.lang.Class")}
158158
const JObject = JavaObject{Symbol("java.lang.Object")}
159159
const JMethod = JavaObject{Symbol("java.lang.reflect.Method")}
160+
const JConstructor = JavaObject{Symbol("java.lang.reflect.Constructor")}
161+
const JField = JavaObject{Symbol("java.lang.reflect.Field")}
160162
const JThread = JavaObject{Symbol("java.lang.Thread")}
161163
const JClassLoader = JavaObject{Symbol("java.lang.ClassLoader")}
162164
const JString = JavaObject{Symbol("java.lang.String")}
163165

166+
#JavaObject(ptr::Ptr{Nothing}) = ptr == C_NULL ? JavaObject(ptr) : JavaObject{Symbol(getclassname(getclass(ptr)))}(ptr)
167+
164168
function JString(str::AbstractString)
165169
jstring = JNI.NewStringUTF(String(str))
166170
if jstring == C_NULL
@@ -345,6 +349,7 @@ metaclass(::Type{JavaObject{T}}) where {T} = metaclass(T)
345349
metaclass(::JavaObject{T}) where {T} = metaclass(T)
346350

347351
javaclassname(class::Symbol) = replace(string(class), "."=>"/")
352+
javaclassname(class::AbstractString) = replace(class, "."=>"/")
348353

349354
function geterror(allow=false)
350355
isexception = JNI.ExceptionCheck()

src/reflect.jl

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ function getname(method::JMethod)
6262
jcall(method, "getName", JString, ())
6363
end
6464

65+
"""
66+
"""
67+
getname(field::JField) = jcall(field, "getName", JString, ())
68+
6569
"""
6670
```
6771
listmethods(obj::JavaObject)
@@ -123,6 +127,29 @@ function getreturntype(method::JMethod)
123127
jcall(method, "getReturnType", JClass, ())
124128
end
125129

130+
"""
131+
gettype(field::JField)
132+
133+
Get type of field
134+
"""
135+
gettype(field::JField) = jcall(field, "getType", JClass, ())
136+
137+
"""
138+
```
139+
listfields(obj::JavaObject)
140+
```
141+
List the fields that are available on the java object passed.
142+
"""
143+
listfields(cls::AbstractString) = listfields(classforname(cls))
144+
listfields(cls::Type{JavaObject{C}}) where C = listfields(classforname(string(C)))
145+
listfields(cls::JClass) = jcall(cls, "getFields", Vector{JField}, ())
146+
listfields(obj::JavaObject) = listfields(getclass(obj))
147+
148+
function listfields(cls::Union{JavaObject{C}, Type{JavaObject{C}}}, name::AbstractString) where C
149+
allfields = listfields(cls)
150+
filter(f -> getname(f) == name, allfields)
151+
end
152+
126153
"""
127154
```
128155
getparametertypes(method::JMethod)
@@ -135,7 +162,7 @@ Returns the parameter types of the java method
135162
### Returns
136163
Vector the parametertypes
137164
"""
138-
function getparametertypes(method::JMethod)
165+
function getparametertypes(method::Union{JMethod,JConstructor})
139166
jcall(method, "getParameterTypes", Vector{JClass}, ())
140167
end
141168

@@ -147,6 +174,12 @@ function Base.show(io::IO, method::JMethod)
147174
print(io, "$rettype $name($argtypestr)")
148175
end
149176

177+
function Base.show(io::IO, field::JField)
178+
name = getname(field)
179+
fieldtype = getname(gettype(field))
180+
print(io, "$fieldtype $name")
181+
end
182+
150183

151184
"""
152185
```

0 commit comments

Comments
 (0)