调用 ff()
要用
Method method = A.class.getMethod("ff", new Class<?>[]{});
或者
Method method = A.class.getMethod("ff", null);
不能用
Method method = A.class.getMethod("ff", (Class<?>)null);
/** * Returns a <code>Method</code> object that reflects the specified public * member method of the class or interface represented by this * <code>Class</code> object. The <code>name</code> parameter is a * <code>String</code> specifying the simple name of the desired method. The * <code>parameterTypes</code> parameter is an array of <code>Class</code> * objects that identify the method's formal parameter types, in declared * order. If <code>parameterTypes</code> is <code>null</code>, it is * treated as if it were an empty array. * * <p> If the <code>name</code> is "{@code <init>};"or "{@code <clinit>}" a * <code>NoSuchMethodException</code> is raised. Otherwise, the method to * be reflected is determined by the algorithm that follows. Let C be the * class represented by this object: * <OL> * <LI> C is searched for any <I>matching methods</I>. If no matching * method is found, the algorithm of step 1 is invoked recursively on * the superclass of C.</LI> * <LI> If no method was found in step 1 above, the superinterfaces of C * are searched for a matching method. If any such method is found, it * is reflected.</LI> * </OL> * * To find a matching method in a class C: If C declares exactly one * public method with the specified name and exactly the same formal * parameter types, that is the method reflected. If more than one such * method is found in C, and one of these methods has a return type that is * more specific than any of the others, that method is reflected; * otherwise one of the methods is chosen arbitrarily. * * <p>Note that there may be more than one matching method in a * class because while the Java language forbids a class to * declare multiple methods with the same signature but different * return types, the Java virtual machine does not. This * increased flexibility in the virtual machine can be used to * implement various language features. For example, covariant * returns can be implemented with {@linkplain * java.lang.reflect.Method#isBridge bridge methods}; the bridge * method and the method being overridden would have the same * signature but different return types. * * <p> See <em>The Java Language Specification</em>, sections 8.2 and 8.4. * * @param name the name of the method * @param parameterTypes the list of parameters * @return the <code>Method</code> object that matches the specified * <code>name</code> and <code>parameterTypes</code> * @exception NoSuchMethodException if a matching method is not found * or if the name is "<init>"or "<clinit>". * @exception NullPointerException if <code>name</code> is <code>null</code> * @exception SecurityException * If a security manager, <i>s</i>, is present and any of the * following conditions is met: * * <ul> * * <li> invocation of * <tt>{@link SecurityManager#checkMemberAccess * s.checkMemberAccess(this, Member.PUBLIC)}</tt> denies * access to the method * * <li> the caller's class loader is not the same as or an * ancestor of the class loader for the current class and * invocation of <tt>{@link SecurityManager#checkPackageAccess * s.checkPackageAccess()}</tt> denies access to the package * of this class * * </ul> * * @since JDK1.1 */ public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException { // be very careful not to change the stack depth of this // checkMemberAccess call for security reasons // see java.lang.SecurityManager.checkMemberAccess checkMemberAccess(Member.PUBLIC, ClassLoader.getCallerClassLoader(), true); Method method = getMethod0(name, parameterTypes); if (method == null) { throw new NoSuchMethodException(getName() + "." + name + argumentTypesToString(parameterTypes)); } return method; }