Skip to content
This repository was archived by the owner on Jun 7, 2019. It is now read-only.

Commit ceaf85e

Browse files
committed
Add class loading for Jar files and API for arrays
1 parent 955ea4a commit ceaf85e

File tree

8 files changed

+146
-6
lines changed

8 files changed

+146
-6
lines changed

package.php.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: java-reflection-ext
2-
version: 1.1.1
2+
version: 1.2.0
33
description: Java Reflection API
44

55
plugins:
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
4+
namespace java\reflection;
5+
6+
7+
use php\io\File;
8+
9+
class JarClassLoader
10+
{
11+
/**
12+
* @param File $jarFile
13+
*/
14+
public function __construct(File $jarFile) {}
15+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
4+
namespace java\reflection;
5+
6+
7+
class ReflectionArray
8+
{
9+
/**
10+
* @param ReflectionClass $class
11+
* @param int $length
12+
* @return ReflectionObject
13+
*/
14+
public static function newInstance(ReflectionClass $class, int $length): ReflectionObject {}
15+
16+
/**
17+
* @param ReflectionObject $object
18+
* @return int
19+
*/
20+
public static function getLength(ReflectionObject $object): int {}
21+
22+
/**
23+
* @param ReflectionObject $object
24+
* @param int $id
25+
* @return ReflectionObject
26+
*/
27+
public static function get(ReflectionObject $object, int $id): ReflectionObject {}
28+
29+
/**
30+
* @param ReflectionObject $object
31+
* @param int $id
32+
* @param ReflectionObject $data
33+
*/
34+
public static function set(ReflectionObject $object, int $id, ReflectionObject $data) {}
35+
}

sdk/java/reflection/ReflectionClass.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ private function __construct() {}
88

99
/**
1010
* @param string $javaClassName
11+
* @param JarClassLoader $cl
1112
* @return ReflectionClass
1213
*/
13-
public static function forName(string $javaClassName): ReflectionClass {}
14+
public static function forName(string $javaClassName, JarClassLoader $cl = null): ReflectionClass {}
1415

1516
public function newInstance(): ReflectionObject {}
1617

src-jvm/main/java/org/venity/javareflection/JavaReflectionExtension.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@
66
import php.runtime.env.Environment;
77
import php.runtime.ext.support.Extension;
88

9-
import java.lang.reflect.Constructor;
10-
import java.lang.reflect.Executable;
11-
import java.lang.reflect.Field;
12-
import java.lang.reflect.Method;
9+
import java.lang.reflect.*;
1310

1411
public class JavaReflectionExtension extends Extension {
1512
public static final String NS = "java\\reflection";
@@ -26,12 +23,15 @@ public String getName() {
2623

2724
@Override
2825
public void onRegister(CompileScope scope) {
26+
registerClass(scope, JarClassLoader.class);
27+
2928
registerWrapperClass(scope, Class.class, ReflectionClass.class);
3029
registerWrapperClass(scope, Object.class, ReflectionObject.class);
3130
registerWrapperClass(scope, Executable.class, ReflectionExecutable.class);
3231
registerWrapperClass(scope, Constructor.class, ReflectionConstructor.class);
3332
registerWrapperClass(scope, Method.class, ReflectionMethod.class);
3433
registerWrapperClass(scope, Field.class, ReflectionField.class);
34+
registerWrapperClass(scope, Array.class, ReflectionArray.class);
3535

3636
registerClass(scope, ReflectionTypes.class);
3737
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.venity.javareflection.classes;
2+
3+
import org.venity.javareflection.JavaReflectionExtension;
4+
import php.runtime.annotation.Reflection;
5+
import php.runtime.env.Environment;
6+
import php.runtime.lang.BaseObject;
7+
import php.runtime.reflection.ClassEntity;
8+
9+
import java.io.File;
10+
import java.net.MalformedURLException;
11+
import java.net.URL;
12+
import java.net.URLClassLoader;
13+
14+
@Reflection.Name("JarClassLoader")
15+
@Reflection.Namespace(JavaReflectionExtension.NS)
16+
public class JarClassLoader extends BaseObject {
17+
18+
public JarClassLoader(Environment env) {
19+
super(env);
20+
}
21+
22+
protected JarClassLoader(ClassEntity entity) {
23+
super(entity);
24+
}
25+
26+
public JarClassLoader(Environment env, ClassEntity clazz) {
27+
super(env, clazz);
28+
}
29+
30+
private URLClassLoader classLoader;
31+
32+
@Reflection.Signature
33+
public void __construct(File jar) throws MalformedURLException {
34+
classLoader = new URLClassLoader(
35+
new URL[] {jar.toURI().toURL()},
36+
this.getClass().getClassLoader()
37+
);
38+
}
39+
40+
public URLClassLoader getClassLoader() {
41+
return classLoader;
42+
}
43+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package org.venity.javareflection.classes;
2+
3+
import org.venity.javareflection.JavaReflectionExtension;
4+
import php.runtime.annotation.Reflection;
5+
import php.runtime.env.Environment;
6+
import php.runtime.lang.BaseWrapper;
7+
import php.runtime.reflection.ClassEntity;
8+
9+
import java.lang.reflect.Array;
10+
11+
@Reflection.Name("ReflectionArray")
12+
@Reflection.Namespace(JavaReflectionExtension.NS)
13+
public class ReflectionArray extends BaseWrapper<Array> {
14+
public ReflectionArray(Environment env, Array wrappedObject) {
15+
super(env, wrappedObject);
16+
}
17+
18+
public ReflectionArray(Environment env, ClassEntity clazz) {
19+
super(env, clazz);
20+
}
21+
22+
@Reflection.Signature
23+
public static ReflectionObject newInstance(Environment environment, Class<?> componentType, int length) {
24+
return new ReflectionObject(environment, Array.newInstance(componentType, length));
25+
}
26+
27+
@Reflection.Signature
28+
public static int getLength(ReflectionObject object) {
29+
return Array.getLength(object.getWrappedObject());
30+
}
31+
32+
@Reflection.Signature
33+
public static ReflectionObject get(Environment environment, ReflectionObject object, int id) {
34+
return new ReflectionObject(environment, Array.get(object.getWrappedObject(), id));
35+
}
36+
37+
@Reflection.Signature
38+
public static void set(Environment environment, ReflectionObject object, int id, ReflectionObject reflectionObject) {
39+
Array.set(object.getWrappedObject(), id, reflectionObject.getWrappedObject());
40+
}
41+
}

src-jvm/main/java/org/venity/javareflection/classes/ReflectionClass.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ public static ReflectionClass forName(Environment env, String className) throws
3232
return new ReflectionClass(env, Class.forName(className));
3333
}
3434

35+
@Reflection.Signature
36+
public static ReflectionClass forName(Environment env, String className, JarClassLoader classLoader) throws ClassNotFoundException {
37+
return new ReflectionClass(env, Class.forName(className, false, classLoader.getClassLoader()));
38+
}
39+
3540
@Reflection.Signature
3641
public ReflectionObject newInstance() throws IllegalAccessException, InstantiationException {
3742
return new ReflectionObject(__env__, __wrappedObject.newInstance());

0 commit comments

Comments
 (0)