zoukankan      html  css  js  c++  java
  • java反射机制(访问私有字段和私有方法)

    来自:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html

    尽管我们通常认为通过JAVA的反射机制来访问其它类的私有字段和私有方法是可行的,其实并没有那么困难。

    注释:只有在单独的JAVA程序中运行该代码才有效,就像你做一些单元测试或者常规的程序。如果你尝试在JAVA APPLET内使用该方法,你需要稍稍修改SecurityManager。但是,因为你不是经常需要与它打交道,这里也就不再赘述了。

    这里是本次内容的列表:

    1. 访问私有字段。

    2. 访问私有方法。

    访问私有字段:

    为了访问私有字段,你需要调用Class.getDeclaredField(String name)或者Class.getDeclaredFields()方法。方法Class.getField(String name)和Class.getFields()仅仅返回共有的字段,所以它们都无法起到作用。这里有一个例子,该例子中有一个包含私有字段的类,在该类下面有通过反射访问私有字段的代码。

    [java] view plain copy
     
    1. public class PrivateObject {  
    2.   
    3.   private String privateString = null;   //声明为私有字段  
    4.   
    5.   public PrivateObject(String privateString) {  
    6.     this.privateString = privateString;  
    7.   }  
    8. }  
    [java] view plain copy
     
    1. PrivateObject privateObject = new PrivateObject("The Private Value");//实例化对象  
    2.   
    3. Field privateStringField = PrivateObject.class.  
    4.             getDeclaredField("privateString");  
    5.   
    6. privateStringField.setAccessible(true);//允许访问私有字段  
    7.   
    8. String fieldValue = (String) privateStringField.get(privateObject);//获得私有字段值  
    9. 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()仅仅返回公有方法,所以它们不会起到作用。下面是一个简单的例子,该例子中有一个拥有私有方法的类,类下面是通过反射机制访问私有方法的代码。

    [java] view plain copy
     
    1. public class PrivateObject {  
    2.   
    3.   private String privateString = null;  
    4.   
    5.   public PrivateObject(String privateString) {  
    6.     this.privateString = privateString;  
    7.   }  
    8.   
    9.   private String getPrivateString(){//私有方法  
    10.     return this.privateString;  
    11.   }  
    12. }  
    [java] view plain copy
     
    1. PrivateObject privateObject = new PrivateObject("The Private Value");  
    2.   
    3. Method privateStringMethod = PrivateObject.class.  
    4.         getDeclaredMethod("getPrivateString", null);  
    5.   
    6. privateStringMethod.setAccessible(true);  
    7.   
    8. String returnValue = (String)  
    9.         privateStringMethod.invoke(privateObject, null);  
    10.       
    11. System.out.println("returnValue = " + returnValue);  
     

    这个代码例子会打印出文本"returnValue = The private Value",该值正好是私有方法的返回值。

  • 相关阅读:
    蘑菇街2016校园招聘第一个编程题
    杭州天丽笔试题
    2016校园招聘 cvte一面被问到的面试题目
    C#中ArrayList,List,数组的区别
    大白话讲解.NET中挂起线程的Thread.Sleep()方法
    OutLook邮箱获取授权码
    EPIC全速下载游戏加速教程
    远程服务器提示:身份验证错误 要求的函数不受支持解决办法汇总-- Windows远程桌面连接
    华硕主板重装系统以后BIOS设置的启动项就没有了,开机就进BIOS,不进系统
    Windows10访问共享文件夹:此用户无法登录,因为该账户当前已被禁用此用户无法登录,因为该账户当前已被禁用或者直接找不到相应的计算机解决办法
  • 原文地址:https://www.cnblogs.com/LvLoveYuForever/p/5722688.html
Copyright © 2011-2022 走看看