Skip to content

Commit 9717ab3

Browse files
authored
Merge pull request #62 from dfdx/class_for_name
class_for_name / Class.forName
2 parents 47f3221 + 610f3de commit 9717ab3

File tree

4 files changed

+27
-1
lines changed

4 files changed

+27
-1
lines changed

src/JavaCall.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export JavaObject, JavaMetaClass,
33
jint, jlong, jbyte, jboolean, jchar, jshort, jfloat, jdouble,
44
JObject, JClass, JMethod, JString,
55
@jimport, jcall, jfield, isnull,
6-
getname, listmethods, getreturntype, getparametertypes
6+
getname, listmethods, getreturntype, getparametertypes, classforname
77

88
using Base.Dates
99

src/core.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ isnull(obj::JavaMetaClass) = obj.ptr == C_NULL
8282
const JClass = JavaObject{Symbol("java.lang.Class")}
8383
const JObject = JavaObject{Symbol("java.lang.Object")}
8484
const JMethod = JavaObject{Symbol("java.lang.reflect.Method")}
85+
const JThread = JavaObject{Symbol("java.lang.Thread")}
86+
const JClassLoader = JavaObject{Symbol("java.lang.ClassLoader")}
8587
const JString = JavaObject{Symbol("java.lang.String")}
8688

8789
function JString(str::AbstractString)

src/reflect.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,23 @@ function Base.show(io::IO, method::JMethod)
136136
argtypestr = join(argtypes, ", ")
137137
print(io, "$rettype $name($argtypestr)")
138138
end
139+
140+
141+
"""
142+
```
143+
classforname(name::String)
144+
```
145+
Create an instance of `Class<name>` (same as `Class.forName(name)` in Java)
146+
147+
### Args
148+
* name: The name of a class to instantiate
149+
150+
### Returns
151+
JavaObject Instance of `Class<name>`
152+
"""
153+
function classforname(name::String)
154+
thread = jcall(JThread, "currentThread", JThread, ())
155+
loader = jcall(thread, "getContextClassLoader", JClassLoader, ())
156+
return jcall(JClass, "forName", JClass, (JString, jboolean, JClassLoader),
157+
name, true, loader)
158+
end

test/runtests.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,5 +191,9 @@ for i in jcall(a, "iterator", @jimport(java.util.Iterator), ())
191191
end
192192
@test length(t) == 0
193193

194+
195+
JStringClass = classforname("java.lang.String")
196+
@test isa(JStringClass, JavaObject{Symbol("java.lang.Class")})
197+
194198
# At the end, unload the JVM before exiting
195199
JavaCall.destroy()

0 commit comments

Comments
 (0)