69 handle = GCHandle.Alloc(member, GCHandleType.WeakTrackResurrection);
75 public IntPtr Cookie => GCHandle.ToIntPtr(handle);
87 readonly RuntimeJavaType declaringType;
106 this.declaringType = declaringType ??
throw new ArgumentNullException(nameof(declaringType));
107 this.name =
string.Intern(name);
108 this.sig =
string.Intern(sig);
122 handle ??= new HandleManager(this);
124 return handle.Cookie;
133 [
System.Security.SecurityCritical]
139 internal RuntimeJavaType DeclaringType => declaringType;
141 internal string Name => name;
145 internal bool IsAccessibleFrom(RuntimeJavaType referencedType, RuntimeJavaType caller, RuntimeJavaType instance)
147 if (referencedType.IsAccessibleFrom(caller))
150 caller == DeclaringType ||
151 IsNestmateOf(caller, DeclaringType) ||
152 IsPublicOrProtectedMemberAccessible(caller, instance) ||
153 (IsInternal && DeclaringType.InternalsVisibleTo(caller)) ||
154 (!IsPrivate && DeclaringType.IsPackageAccessibleFrom(caller)))
158 && (!(HasNonPublicTypeInSignature || IsType2FinalField) || InPracticeInternalsVisibleTo(caller));
164 static bool IsNestmateOf(RuntimeJavaType caller, RuntimeJavaType declaringType)
166 if (caller.ClassLoader != declaringType.ClassLoader)
169 return string.Equals(GetNestHostName(caller.Name), GetNestHostName(declaringType.Name), StringComparison.Ordinal);
172 static string GetNestHostName(
string name)
174 var separator = name.IndexOf(
'$');
175 return separator < 0 ? name : name.Substring(0, separator);
177 bool IsPublicOrProtectedMemberAccessible(RuntimeJavaType caller, RuntimeJavaType instance)
179 if (IsPublic || (IsProtected && caller.IsSubTypeOf(DeclaringType) && (IsStatic || instance.IsUnloadable || instance.IsSubTypeOf(caller))))
180 return DeclaringType.IsPublic || InPracticeInternalsVisibleTo(caller);
185 bool InPracticeInternalsVisibleTo(RuntimeJavaType caller)
188 if (DeclaringType.TypeAsTBD.Assembly.Equals(caller.TypeAsTBD.Assembly))
197 return DeclaringType.InternalsVisibleTo(caller);
200 internal bool IsHideFromReflection => (flags &
MemberFlags.HideFromReflection) != 0;
202 internal bool IsExplicitOverride => (flags &
MemberFlags.ExplicitOverride) != 0;
204 internal bool IsMirandaMethod => (flags &
MemberFlags.MirandaMethod) != 0;
206 internal bool IsAccessStub => (flags &
MemberFlags.AccessStub) != 0;
208 internal bool IsPropertyAccessor
212 return (flags &
MemberFlags.PropertyAccessor) != 0;
223 flags &= ~MemberFlags.PropertyAccessor;
228 internal bool IsIntrinsic => (flags &
MemberFlags.Intrinsic) != 0;
240 internal bool HasNonPublicTypeInSignature => (flags &
MemberFlags.NonPublicTypeInSignature) != 0;
247 internal bool IsType2FinalField => (flags &
MemberFlags.Type2FinalField) != 0;
249 internal bool HasCallerID => (flags &
MemberFlags.CallerID) != 0;
251 internal bool IsDelegateInvokeWithByRefParameter => (flags &
MemberFlags.DelegateInvokeWithByRefParameter) != 0;
253 internal bool IsNoOp => (flags &
MemberFlags.NoOp) != 0;
259 internal bool IsInternal => (flags &
MemberFlags.InternalAccess) != 0;
272 internal bool IsModuleInitializer => IsStatic && IsPrivate ==
false && (flags &
MemberFlags.ModuleInitializer) != 0;