class Object: HandleEnv {
private:
jobject object;
std::string name;
std::vector<JavaMethod> methods;
Reflect reflect;
Invoke invoke;
public:
Object(JVMLoader env, std::string className);
JavaMethod FindFirstMethod( std::string methodName );
std::vector<JavaMethod> FindMethod( std::string methodName );
JavaMethod LookupMethod(std::string methodName, std::vector<BaseJavaValue *>& arguments );
template <typename T>
T Call(std::string methodName) {
std::vector<BaseJavaValue *> empty;
return Call<T>(methodName, empty);
}
template <typename T>
T Call(std::string methodName, std::vector<BaseJavaValue *>& arguments) {
auto method = LookupMethod(methodName, arguments);
auto javaValues = Arguments::Create(GetEnv(), arguments);
T tmp;
if(tmp.GetType() != method.GetReturnTypeInfo() && tmp.GetType() != "object" )
throw VMError{"Not supported type using " +tmp.GetType()+ " expected " + method.GetReturnTypeInfo() };
return invoke.Call<T>(object, method.GetMethodRef(), (jvalue*)&javaValues[0]);
}
const std::vector<JavaMethod>& GetMembers();
std::string GetClassName();
void ReleaseThread(){ Release(); }
};
#endif /* jvm_reflect_hpp */