/
class_member.go
70 lines (53 loc) · 1.67 KB
/
class_member.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package heap
import "github.com/Frederick-S/jvmgo/classfile"
type ClassMember struct {
accessFlags uint16
name string
descriptor string
class *Class
}
func (classMember *ClassMember) copyMemberInfo(memberInfo *classfile.MemberInfo) {
classMember.accessFlags = memberInfo.GetAccessFlags()
classMember.name = memberInfo.GetName()
classMember.descriptor = memberInfo.GetDescriptor()
}
func (classMember *ClassMember) IsPublic() bool {
return classMember.accessFlags&ACC_PUBLIC != 0
}
func (classMember *ClassMember) IsPrivate() bool {
return classMember.accessFlags&ACC_PRIVATE != 0
}
func (classMember *ClassMember) IsProtected() bool {
return classMember.accessFlags&ACC_PROTECTED != 0
}
func (classMember *ClassMember) IsStatic() bool {
return classMember.accessFlags&ACC_STATIC != 0
}
func (classMember *ClassMember) IsFinal() bool {
return classMember.accessFlags&ACC_FINAL != 0
}
func (classMember *ClassMember) IsSynthetic() bool {
return classMember.accessFlags&ACC_SYNTHETIC != 0
}
func (classMember *ClassMember) GetName() string {
return classMember.name
}
func (classMember *ClassMember) GetDescriptor() string {
return classMember.descriptor
}
func (classMember *ClassMember) GetClass() *Class {
return classMember.class
}
func (classMember *ClassMember) IsAccessibleTo(otherClass *Class) bool {
if classMember.IsPublic() {
return true
}
class := classMember.class
if classMember.IsProtected() {
return otherClass == class || otherClass.IsSubClassOf(class) || class.GetPackageName() == otherClass.GetPackageName()
}
if !classMember.IsPrivate() {
return class.GetPackageName() == otherClass.GetPackageName()
}
return class == otherClass
}