64,266
社区成员
发帖
与我相关
我的任务
分享
class Handle VALUE_OBJ_CLASS_SPEC {
private:
oop* _handle;
protected:
oop obj() const { return _handle == NULL ? (oop)NULL : *_handle; }
oop non_null_obj() const { assert(_handle != NULL, "resolving NULL handle"); return *_handle; }
public:
// Constructors
Handle() { _handle = NULL; }
Handle(oop obj);
#ifndef ASSERT
Handle(Thread* thread, oop obj);
#else
// Don't inline body with assert for current thread
Handle(Thread* thread, oop obj);
#endif // ASSERT
// General access
oop operator () () const { return obj(); }
oop operator -> () const { return non_null_obj(); }
bool operator == (oop o) const { return obj() == o; }
bool operator == (const Handle& h) const { return obj() == h.obj(); }
// Null checks
bool is_null() const { return _handle == NULL; }
bool not_null() const { return _handle != NULL; }
// Debugging
void print() { obj()->print(); }
// Direct interface, use very sparingly.
// Used by JavaCalls to quickly convert handles and to create handles static data structures.
// Constructor takes a dummy argument to prevent unintentional type conversion in C++.
Handle(oop *handle, bool dummy) { _handle = handle; }
// Raw handle access. Allows easy duplication of Handles. This can be very unsafe
// since duplicates is only valid as long as original handle is alive.
oop* raw_value() { return _handle; }
static oop raw_resolve(oop *handle) { return handle == NULL ? (oop)NULL : *handle; }
};
obj->klass()
class KlassHandle: public Handle {
protected:
klassOop obj() const { return (klassOop)Handle::obj(); }
klassOop non_null_obj() const { return (klassOop)Handle::non_null_obj(); }
Klass* as_klass() const { return non_null_obj()->klass_part(); }
public:
// Constructors
KlassHandle () : Handle() {}
KlassHandle (oop obj) : Handle(obj) {
assert(SharedSkipVerify || is_null() || obj->is_klass(), "not a klassOop");
}
KlassHandle (Klass* kl) : Handle(kl ? kl->as_klassOop() : (klassOop)NULL) {
assert(SharedSkipVerify || is_null() || obj()->is_klass(), "not a klassOop");
}
// Faster versions passing Thread
KlassHandle (Thread* thread, oop obj) : Handle(thread, obj) {
assert(SharedSkipVerify || is_null() || obj->is_klass(), "not a klassOop");
}
KlassHandle (Thread *thread, Klass* kl)
: Handle(thread, kl ? kl->as_klassOop() : (klassOop)NULL) {
assert(is_null() || obj()->is_klass(), "not a klassOop");
}
// Direct interface, use very sparingly.
// Used by SystemDictionaryHandles to create handles on existing WKKs.
// The obj of such a klass handle may be null, because the handle is formed
// during system bootstrapping.
KlassHandle(klassOop *handle, bool dummy) : Handle((oop*)handle, dummy) {
assert(SharedSkipVerify || is_null() || obj() == NULL || obj()->is_klass(), "not a klassOop");
}
// General access
klassOop operator () () const { return obj(); }
Klass* operator -> () const { return as_klass(); }
};
这是它的一个子类。
下面那个调用的全部语句是
const KlassHandle klass (THREAD, obj->klass());
这下清楚吗,哥们 要是还不清楚,你要什么我给你。可别走啊。
oop operator () () const { return obj(); }
oop operator -> () const { return non_null_obj(); }
obj->klass();
看起不是一个正确的语句。