当前位置:  编程技术>java/j2ee

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

    来源: 互联网  发布时间:2014-10-22

    本文导语:  尽管我们通常认为通过JAVA的反射机制来访问其它类的私有字段和私有方法是可行的,其实并没有那么困难。 注释:只有在单独的JAVA程序中运行该代码才有效,就像你做一些单元测试或者常规的程序。如果你尝试在JAVA APPLET内...

尽管我们通常认为通过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);

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

    
 
 

您可能感兴趣的文章:

  • 在Java中,用Mircosoft SQL Server数据库,请问要进行日期字段的读取,用( ResultSet rs ; rs.getDate(1),其中1代表相应的字段为 DateTi
  • 请问在java钟如何得到数据库中的记录总数,以及如何求数据库中一个字段的和? iis7站长之家
  • java怎样读取数据库表中字段的数据类型?
  • 请问Access数据库中的日期型字段是对应java中的哪个Date类?
  • 高手请看:如何用java存取DB2中的BLOB字段!!
  • 数据库中日期型字段,如何在 java 中分别获得其中的年月日
  • java里有没有办法得到一个表里的字段名
  • java中有没有什么方法可以求出数据库表中的字段名?赋到一个String的数组中?
  • java中的数据库结果集可以被赋值吗,可以通过结果集的方法来更新数据库字段吗?
  • 请问在java钟如何得到数据库中的记录总数,以及如何求数据库中一个字段的和?
  • 请教用java从properties文件中读取属性字段的方法?
  • 奇怪啊,奇怪,为什么我的JB7做EJB时,只要在EJB设计面板上随便做点东西,我的EJB的JAVA的源码就会变的不见了,或者少了很多字段申明??
  • ado的rs.field("字段名")可以访问任何类型的数据,那吗java里面这种问题如何处理。是不是要先判断类型然后再根据类型来使用相应的getint or getString阿!谢谢了!在线等待!
  • java sqlserver text 类型字段读取方法
  • 用JAVA从数据库中读出字段及内容
  • 请问oracle的clob字段可不可以存富文本的文件,like .doc .rtf?如果可以如何用java读取?
  • java读写oracle的blob字段示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java 反射封装库 Mirror
  • 高手请进:JAVA中的“反射”是什么?
  • java增强开发类,反射工具 absir-core
  • 关于JAVA反射实现的问题
  • 请问java.lang.reflect这个包(反射)的主要用途?java.lang.reflect.Method这个类是干什么用的?
  • java反射机制示例
  • java反射使用示例分享
  • java根据方法名称取得反射方法的参数类型示例
  • Java反射学习 getClass()函数应用
  • java利用反射实现动态代理示例
  • java反射android的r文件的示例
  • Java反射工具包 reflectutils
  • Java 采用反射获取class属性值的实现代码
  • Java反射机制(Reflection)浅析
  • java类加载器和类反射使用示例
  • java反射实现javabean转json实例代码
  • java反射机制示例详解
  • java反射机制实战示例分享
  • java反射技术与类使用示例
  • java使用dom4j解析xml配置文件实现抽象工厂反射示例
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3