遇到问题
今天逛论坛的时候看到一个人在问,private
这个方法别的类能用么?我当时感觉这不是扯么,四个修饰不知道么?private肯定是只能自己来用。但是看到别人的解答说可以用反射来获得,这就感觉很新奇然后自己决定去试一下,并且看一下java的API。
代码实现
package StudyPrivate;
public class Some {
public void doSoming() {
System.out.println("doSoming");
}
private void doSomingPrivte() {
System.out.println("doSomingprivate");
}
}
package StudyPrivate;
import java.lang.reflect.Method;
public class DemoPrivateInvoke {
public static void main(String[] args) {
printMethodPrivateInvoke(new Some());
}
public static void printMethodPrivateInvoke(Object obj) {
Class c1 = obj.getClass();
try {
Method method = c1.getDeclaredMethod("doSomingPrivte");
method.setAccessible(true);
method.invoke(obj);
} catch (Exception e){
e.printStackTrace();
}
}
}
方法解析
- c1.getDeclaredMethod("doSomingPrivate")获取到Some类中所有的方法对象dm,getDeclaredMethod方法可以获取到Some中所有方法,也就是通过(private,protected,default,public)修饰的方法。
- method.setAccessible(true)这样在调用方法时他不会检查方法的修饰是public还是private。如果没有method.setAccessible(true),那在invoke()调用方法时会报错,同样如果调用方法setAccessible()设置的是false,一样会报错。
- method.invoke(obj),对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。
网友评论