@@ -353,14 +353,66 @@ NAN_METHOD(Java::newProxy) {
353353 return NanThrowError (javaExceptionToV8 (self, env, errStr.str ()));
354354 }
355355
356+ // create the NodeDynamicProxyClass
357+ jclass constructorClazz = env->FindClass (" java/lang/reflect/Constructor" );
358+ jmethodID constructor_newInstance = env->GetMethodID (constructorClazz, " newInstance" , " ([Ljava/lang/Object;)Ljava/lang/Object;" );
359+
360+ // printf("invoke: %s\n", javaMethodCallToString(env, m_method, constructor_newInstance, m_args).c_str());
361+
356362 // run constructor
357- v8::Handle<v8::Value> callback = NanNull ();
358- NewInstanceBaton* baton = new NewInstanceBaton (self, clazz, method, methodArgs, callback);
359- v8::Handle<v8::Value> result = baton->runSync ();
360- delete baton;
361- if (result->IsNativeError ()) {
362- return NanThrowError (result);
363+ jobject dynamicProxy = env->CallObjectMethod (method, constructor_newInstance, methodArgs);
364+ if (env->ExceptionCheck ()) {
365+ std::ostringstream errStr;
366+ errStr << " Error creating class" ;
367+ return NanThrowError (javaExceptionToV8 (self, env, errStr.str ()));
368+ }
369+
370+ jclass dynamicInterface = javaFindClass (env, interfaceName);
371+ if (dynamicInterface == NULL ) {
372+ std::ostringstream errStr;
373+ errStr << " Could not find interface " ;
374+ errStr << interfaceName;
375+ return NanThrowError (javaExceptionToV8 (self, env, errStr.str ()));
376+ }
377+ jclass classClazz = env->FindClass (" java/lang/Class" );
378+ jobjectArray classArray = env->NewObjectArray (1 , classClazz, NULL );
379+ if (classArray == NULL ) {
380+ std::ostringstream errStr;
381+ errStr << " Could not create class array for Proxy" ;
382+ return NanThrowError (javaExceptionToV8 (self, env, errStr.str ()));
383+ }
384+ env->SetObjectArrayElement (classArray, 0 , dynamicInterface);
385+
386+ jmethodID class_getClassLoader = env->GetMethodID (classClazz, " getClassLoader" , " ()Ljava/lang/ClassLoader;" );
387+ jobject classLoader = env->CallObjectMethod (dynamicInterface, class_getClassLoader);
388+ assert (!env->ExceptionCheck ());
389+
390+ if (classLoader == NULL ) {
391+ jclass objectClazz = env->FindClass (" java/lang/Object" );
392+ jmethodID object_getClass = env->GetMethodID (objectClazz, " getClass" , " ()Ljava/lang/Class;" );
393+ jobject jobjClass = env->CallObjectMethod (dynamicProxy, object_getClass);
394+ checkJavaException (env);
395+ classLoader = env->CallObjectMethod (jobjClass, class_getClassLoader);
396+ checkJavaException (env);
363397 }
398+ if (classLoader == NULL ) {
399+ std::ostringstream errStr;
400+ errStr << " Could not get classloader for Proxy" ;
401+ return NanThrowError (javaExceptionToV8 (self, env, errStr.str ()));
402+ }
403+
404+ // create proxy instance
405+ jclass proxyClass = env->FindClass (" java/lang/reflect/Proxy" );
406+ jmethodID proxy_newProxyInstance = env->GetStaticMethodID (proxyClass, " newProxyInstance" , " (Ljava/lang/ClassLoader;[Ljava/lang/Class;Ljava/lang/reflect/InvocationHandler;)Ljava/lang/Object;" );
407+ jobject proxyInstance = env->CallStaticObjectMethod (proxyClass, proxy_newProxyInstance, classLoader, classArray, dynamicProxy);
408+ if (env->ExceptionCheck ()) {
409+ std::ostringstream errStr;
410+ errStr << " Error creating java.lang.reflect.Proxy" ;
411+ return NanThrowError (javaExceptionToV8 (self, env, errStr.str ()));
412+ }
413+
414+ v8::Handle<v8::Value> result = javaToV8 (self, env, proxyInstance);
415+
364416 NanAssignPersistent (dynamicProxyData->jsObject , result);
365417 NanReturnValue (result);
366418}
0 commit comments