bool class_t::isAssignableFrom (class_t* other) { ___CBTPUSH; bool result; if (other == this) { result = true; } else if (other->superclass == NULL) { result = false; } else { result = isAssignableFrom (other->superclass); } ___CBTPOP; return result; }
template <typename Target> Target object_cast(const java::lang::Object &obj) { auto target_name = jni::class_name<Target>::name(); auto target_cls = java::lang::Class::forName(target_name); auto source_cls = obj.getClass(); if (!target_cls.isAssignableFrom(source_cls)) { // TODO: implement ClassCastException throw std::bad_cast("cannot cast " + source_cls.getName() + " to " target_cls.getName()); } global_ref<raw::object_ref> ref_copy{obj._ref}; return Target{std::move(ref_copy)}; }