|
2 | 2 | #include "javaObject.h" |
3 | 3 | #include "java.h" |
4 | 4 | #include "utils.h" |
| 5 | +#include <sstream> |
5 | 6 |
|
6 | 7 | /*static*/ v8::Persistent<v8::FunctionTemplate> JavaObject::s_ct; |
7 | 8 |
|
|
27 | 28 |
|
28 | 29 | self->m_methods = javaReflectionGetMethods(env, self->m_class); |
29 | 30 | jclass methodClazz = env->FindClass("java/lang/reflect/Method"); |
30 | | - jmethodID method_getNameMethod = env->GetMethodID(methodClazz, "getName", "()Ljava/lang/String;"); |
| 31 | + jmethodID method_getName = env->GetMethodID(methodClazz, "getName", "()Ljava/lang/String;"); |
31 | 32 | for(std::list<jobject>::iterator it = self->m_methods.begin(); it != self->m_methods.end(); it++) { |
32 | | - std::string methodNameStr = javaToString(env, (jstring)env->CallObjectMethod(*it, method_getNameMethod)); |
| 33 | + std::string methodNameStr = javaToString(env, (jstring)env->CallObjectMethod(*it, method_getName)); |
33 | 34 |
|
34 | 35 | v8::Handle<v8::String> methodName = v8::String::New(methodNameStr.c_str()); |
35 | 36 | v8::Local<v8::FunctionTemplate> methodCallTemplate = v8::FunctionTemplate::New(methodCall, methodName); |
|
40 | 41 | javaObjectObj->Set(methodNameSync, methodCallSyncTemplate->GetFunction()); |
41 | 42 | } |
42 | 43 |
|
43 | | - // TODO: add public field support |
| 44 | + self->m_fields = javaReflectionGetFields(env, self->m_class); |
| 45 | + jclass fieldClazz = env->FindClass("java/lang/reflect/Field"); |
| 46 | + jmethodID field_getName = env->GetMethodID(fieldClazz, "getName", "()Ljava/lang/String;"); |
| 47 | + for(std::list<jobject>::iterator it = self->m_fields.begin(); it != self->m_fields.end(); it++) { |
| 48 | + std::string fieldNameStr = javaToString(env, (jstring)env->CallObjectMethod(*it, field_getName)); |
| 49 | + |
| 50 | + v8::Handle<v8::String> fieldName = v8::String::New(fieldNameStr.c_str()); |
| 51 | + javaObjectObj->SetAccessor(fieldName, fieldGetter, fieldSetter); |
| 52 | + } |
44 | 53 |
|
45 | 54 | return scope.Close(javaObjectObj); |
46 | 55 | } |
@@ -110,3 +119,68 @@ JavaObject::~JavaObject() { |
110 | 119 | delete baton; |
111 | 120 | return scope.Close(result);; |
112 | 121 | } |
| 122 | + |
| 123 | +/*static*/ v8::Handle<v8::Value> JavaObject::fieldGetter(v8::Local<v8::String> property, const v8::AccessorInfo& info) { |
| 124 | + v8::HandleScope scope; |
| 125 | + JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(info.This()); |
| 126 | + JNIEnv *env = self->m_java->getJavaEnv(); |
| 127 | + |
| 128 | + v8::String::AsciiValue propertyStr(property); |
| 129 | + jobject field = javaFindField(env, self->m_class, *propertyStr); |
| 130 | + if(field == NULL) { |
| 131 | + std::ostringstream errStr; |
| 132 | + errStr << "Could not find field " << *propertyStr; |
| 133 | + return ThrowException(javaExceptionToV8(env, errStr.str())); |
| 134 | + } |
| 135 | + |
| 136 | + jclass fieldClazz = env->FindClass("java/lang/reflect/Field"); |
| 137 | + jmethodID field_get = env->GetMethodID(fieldClazz, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); |
| 138 | + jmethodID field_getType = env->GetMethodID(fieldClazz, "getType", "()Ljava/lang/Class;"); |
| 139 | + |
| 140 | + // get field type |
| 141 | + jclass fieldTypeClazz = (jclass)env->CallObjectMethod(field, field_getType); |
| 142 | + jvalueType resultType = javaGetType(env, fieldTypeClazz); |
| 143 | + |
| 144 | + // get field value |
| 145 | + jobject val = env->CallObjectMethod(field, field_get, self->m_obj); |
| 146 | + if(env->ExceptionOccurred()) { |
| 147 | + std::ostringstream errStr; |
| 148 | + errStr << "Could not get field " << *propertyStr; |
| 149 | + return ThrowException(javaExceptionToV8(env, errStr.str())); |
| 150 | + } |
| 151 | + |
| 152 | + return scope.Close(javaToV8(self->m_java, env, resultType, val)); |
| 153 | +} |
| 154 | + |
| 155 | +/*static*/ void JavaObject::fieldSetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo& info) { |
| 156 | + v8::HandleScope scope; |
| 157 | + JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(info.This()); |
| 158 | + JNIEnv *env = self->m_java->getJavaEnv(); |
| 159 | + |
| 160 | + jvalueType methodArgType; |
| 161 | + jobject newValue = v8ToJava(env, value, &methodArgType); |
| 162 | + |
| 163 | + v8::String::AsciiValue propertyStr(property); |
| 164 | + jobject field = javaFindField(env, self->m_class, *propertyStr); |
| 165 | + if(field == NULL) { |
| 166 | + std::ostringstream errStr; |
| 167 | + errStr << "Could not find field " << *propertyStr; |
| 168 | + ThrowException(javaExceptionToV8(env, errStr.str())); |
| 169 | + return; |
| 170 | + } |
| 171 | + |
| 172 | + jclass fieldClazz = env->FindClass("java/lang/reflect/Field"); |
| 173 | + jmethodID field_set = env->GetMethodID(fieldClazz, "set", "(Ljava/lang/Object;Ljava/lang/Object;)V"); |
| 174 | + |
| 175 | + //printf("newValue: %s\n", javaObjectToString(env, newValue).c_str()); |
| 176 | + |
| 177 | + // set field value |
| 178 | + env->CallObjectMethod(field, field_set, self->m_obj, newValue); |
| 179 | + if(env->ExceptionOccurred()) { |
| 180 | + std::ostringstream errStr; |
| 181 | + errStr << "Could not set field " << *propertyStr; |
| 182 | + ThrowException(javaExceptionToV8(env, errStr.str())); |
| 183 | + return; |
| 184 | + } |
| 185 | +} |
| 186 | + |
0 commit comments