Example #1
0
		private static void DiscoverAccessibleMethods(Type clazz, IDictionary<JavaMembers.MethodSignature, MethodInfo> map, bool includeProtected, bool includePrivate)
		{
			if (Modifier.IsPublic(clazz.Attributes) || includePrivate)
			{
				try
				{
					if (includeProtected || includePrivate)
					{
						while (clazz != null)
						{
							try
							{
								MethodInfo[] methods = Sharpen.Runtime.GetDeclaredMethods(clazz);
								foreach (MethodInfo method in methods)
								{
									int mods = method.Attributes;
									if (Modifier.IsPublic(mods) || Modifier.IsProtected(mods) || includePrivate)
									{
										JavaMembers.MethodSignature sig = new JavaMembers.MethodSignature(method);
										if (!map.ContainsKey(sig))
										{
											if (includePrivate && !method.IsAccessible())
											{
											}
											map.Put(sig, method);
										}
									}
								}
								clazz = clazz.BaseType;
							}
							catch (SecurityException)
							{
								// Some security settings (i.e., applets) disallow
								// access to Class.getDeclaredMethods. Fall back to
								// Class.getMethods.
								MethodInfo[] methods = clazz.GetMethods();
								foreach (MethodInfo method in methods)
								{
									JavaMembers.MethodSignature sig = new JavaMembers.MethodSignature(method);
									if (!map.ContainsKey(sig))
									{
										map.Put(sig, method);
									}
								}
								break;
							}
						}
					}
					else
					{
						// getMethods gets superclass methods, no
						// need to loop any more
						MethodInfo[] methods = clazz.GetMethods();
						foreach (MethodInfo method in methods)
						{
							JavaMembers.MethodSignature sig = new JavaMembers.MethodSignature(method);
							// Array may contain methods with same signature but different return value!
							if (!map.ContainsKey(sig))
							{
								map.Put(sig, method);
							}
						}
					}
					return;
				}
				catch (SecurityException)
				{
					Context.ReportWarning("Could not discover accessible methods of class " + clazz.FullName + " due to lack of privileges, " + "attemping superclasses/interfaces.");
				}
			}
			// Fall through and attempt to discover superclass/interface
			// methods
			Type[] interfaces = clazz.GetInterfaces();
			foreach (Type intface in interfaces)
			{
				DiscoverAccessibleMethods(intface, map, includeProtected, includePrivate);
			}
			Type superclass = clazz.BaseType;
			if (superclass != null)
			{
				DiscoverAccessibleMethods(superclass, map, includeProtected, includePrivate);
			}
		}