• Java 反射之私有字段和方法详细介绍


        -----------疯狂软件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),你关掉了对于这个指定字段实例的访问检查,java培训仅仅对反射有效。现在你能访问它了,不管它是私有的,保护的或是默认的(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);

      疯狂软件java培训、ios培训新年钜惠,报名Java就业班免费赠送java基础班,报名iOS就业班免费赠送iOS基础班,本月火速抢座中,为回报广大新老学员,值此新年之际推出报读就业班赠送基础班的活动

      ------------2014年初活动--------------------------

      疯狂软件Java学习班方向:

      1.报读JavaEE就业班赠送基础班课程。

      2.开班一次性(一个月内)交清JavaEE就业班学费,赠送基础班全套课程。

      疯狂软件iOS学习班方向:

      1.报读iOS应用+手游就业班赠送iOS基础班课程。

      2.开班一次性(一个月内)交清iOS应用+手游就业班就业班学费,赠送基础班全套课程。

  • 相关阅读:
    Codeforces 1515 H. Phoenix and Bits 题解
    Codeforces 1511 F. Chainword 题解
    Codeforces 1369F. BareLee 题解
    莫队学习笔记
    圆方树学习笔记
    虚树学习笔记
    NOIP2020退役记
    CSP-S2 2021 场外
    我。
    WC2021 游记
  • 原文地址:https://www.cnblogs.com/gojava/p/3525046.html
Copyright © 2020-2023  润新知