《java之反射访问私有域和私有方法》

版权声明:欢迎转载但需要附上原博客链接 https://blog.csdn.net/qq_37746725?assign_skin=skin-ink https://blog.csdn.net/qq_37746725/article/details/82321176

本文将介绍Java 反射之私有字段和方法的应用,需呀了解的朋友可以参考下

尽管我们通常认为通过JAVA的反射机制来访问其它类的私有字段和私有方法是可行的,其实并没有那么困难。 
注释:只有在单独的JAVA程序中运行该代码才有效,就像你做一些单元测试或者常规的程序。如果你尝试在JAVA APPLET内使用该方法,你需要稍稍修改SecurityManager。但是,因为你不是经常需要与它打交道,这里也就不再赘述了。 
这里是本次内容的列表: 
1.访问私有字段。 
2.访问私有方法。 
访问私有字段: 
为了访问私有字段,你需要调用Class.getDeclaredField(String name)或者Class.getDeclaredFields()方法。方法Class.getField(String name)和Class.getFields()仅仅返回共有的字段,所以它们都无法起到作用。这里有一个例子,该例子中有一个包含私有字段的类,在该类下面有通过反射访问私有字段的代码。 

代码如下:


public class PrivateObject {  
private String privateString = null; //声明为私有字段  
public PrivateObject(String privateString) {  
this.privateString = privateString;  
}  
}  

代码如下:


PrivateObject privateObject = new PrivateObject("The Private Value");//实例化对象  
Field privateStringField = PrivateObject.class.  
getDeclaredField("privateString");  
privateStringField.setAccessible(true);//允许访问私有字段  
String fieldValue = (String) privateStringField.get(privateObject);//获得私有字段值  
System.out.println("fieldValue = " + fieldValue);  


这个代码会打印出文本"fieldValue = The Private Value",而该值正好是对象PrivateObject的私有字段privateString的值。  
注意到我们使用了方法PrivateObject.class.getDeclaredfield("privateString")。正是这个调用这个方法返回了私有字段。这个方法仅仅根据指定的类返回字段,不会返回父类申明的字段。  
另外仔细观察加粗的语句。通过调用 Field.setAccessible(true),你关掉了对于这个指定字段实例的访问检查,仅仅对反射有效。现在你能访问它了,不管它是私有的,保护的或是默认的(default),即时调用者并不在该范围中。你仍然不能通过常规方法访问该字段,因为编译器不允许。  
访问私有方法  
为了访问一个私有方法,你需要调用Class.getDeclaredMethod(String name,Class[] parameterTypes)或者Class.getDeclaredMethods()方法。方法Class.getMethod(String name,Class[] parameterTypes)和Class.getMethods()仅仅返回公有方法,所以它们不会起到作用。下面是一个简单的例子,该例子中有一个拥有私有方法的类,类下面是通过反射机制访问私有方法的代码。  

代码如下:


public class PrivateObject {  
private String privateString = null;  
public PrivateObject(String privateString) {  
this.privateString = privateString;  
}  
private String getPrivateString(){//私有方法  
return this.privateString;  
}  
}  

代码如下:


PrivateObject privateObject = new PrivateObject("The Private Value");  
Method privateStringMethod = PrivateObject.class.  
getDeclaredMethod("getPrivateString", null);  
privateStringMethod.setAccessible(true);  
String returnValue = (String)  
privateStringMethod.invoke(privateObject, null);  
System.out.println("returnValue = " + returnValue);  

fields[i].setAccessible(true);这句主要是因为私有的变量在对象外是无法访问的,通过这个设置就可以改变私有变量的访问权,还真的有点恐怖,当偶把这个解决方法告诉Boss的时候,Boss差点吐血,私有的都能访问了,还有什么安全可言?
 

不过了,有安全就有特权,所以由于能很好的解决问题还是被采纳了

getDeclaredMethod()和getMethod()的区别

getDeclaredMethod*()获取的是类自身声明的所有方法,包含public、protected和private方法。

getMethod*()获取的是类的所有共有方法,这就包括自身的所有public方法,和从基类继承的、从接口实现的所有public方法。

猜你喜欢

转载自blog.csdn.net/qq_37746725/article/details/82321176