package php.runtime.ext.java;
import php.runtime.Memory;
import php.runtime.env.Environment;
import php.runtime.memory.ObjectMemory;
import php.runtime.memory.StringMemory;
import php.runtime.memory.support.MemoryUtils;
import php.runtime.reflection.ClassEntity;
import java.lang.reflect.Field;
import static php.runtime.annotation.Reflection.*;
@Name("php\\lang\\JavaObject")
final public class JavaObject extends JavaReflection {
protected Object object;
public JavaObject(Environment env, ClassEntity clazz) {
super(env, clazz);
}
public void setObject(Object object) {
this.object = object;
}
public Object getObject() {
return object;
}
@Signature(@Arg("name"))
public Memory __get(Environment env, Memory... args){
String name = args[0].toString();
try {
Field field = object.getClass().getField(name);
field.setAccessible(true);
return MemoryUtils.valueOf(env, field.get(object));
} catch (NoSuchFieldException e) {
exception(env, e);
} catch (IllegalAccessException e) {
exception(env, e);
}
return Memory.NULL;
}
@Signature({@Arg("name"), @Arg("value")})
public Memory __set(Environment env, Memory... args){
String name = args[0].toString();
try {
Field field = object.getClass().getField(name);
field.setAccessible(true);
field.set(object, MemoryUtils.fromMemory(args[1], field.getType()));
} catch (NoSuchFieldException e) {
exception(env, e);
} catch (IllegalAccessException e) {
exception(env, e);
}
return Memory.NULL;
}
@Name("getClass")
@Signature
public Memory _getClass(Environment env, Memory... args){
return new ObjectMemory(JavaClass.of(env, object.getClass()));
}
@Signature
public Memory getClassName(Environment env, Memory... args){
return new StringMemory(object.getClass().getName());
}
public static JavaObject of(Environment env, Object value){
JavaObject javaObject = new JavaObject(env, env.fetchClass("php\\lang\\JavaObject"));
javaObject.setObject(value);
return javaObject;
}
}