Java reflection accessing method with default modi

2019-04-09 05:11发布

问题:

Is it possible to invoke the no modifier method in a superclass through Java reflection?

回答1:

Method method = getClass().getSuperclass().getDeclaredMethod("doSomething");
method.invoke(this);

if you have a bigger hierarchy, you can use:

Class current = getClass();
Method method = null;
while (current != Object.class) {
     try {
          method = current.getDeclaredMethod("doSomething");
          break;
     } catch (NoSuchMethodException ex) {
          current = current.getSuperclass();
     }
}
// only needed if the two classes are in different packages
method.setAccessible(true); 
method.invoke(this);

(the above examples are for a method named doSomething with no arguments. If your method has arguments, you have to add their types as arguments to the getDeclaredMethod(...) method)



回答2:

After reading the original question -- I realize I assumed you were trying to call an overridden method. Which is what I was trying to do and how I came to find this thread. Calling a base class non-overridden method should work as others here have described. However, if you are trying to call an overridden method, my answer stands as below:

I don't think calling an overridden method is possible, per

http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on

Most notably:

Method.invoke

If the underlying method is an instance method, it is invoked using dynamic method lookup as documented in The Java Language Specification, Second Edition, section 15.12.4.4; in particular, overriding based on the runtime type of the target object will occur.



回答3:

Yes. You may need to call setAccessible(true) on the Method object before you invoke it.