`

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);

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

转自
http://www.jb51.net/article/32170.htm
分享到:
评论

相关推荐

    Java常用的反射方法

    3.4 获取私有的变量(利用暴力反射) 4. 反射获取构造方法 4.1有参构造 4.2无参构造 4.3无参构造简便写法 5.反射获取成员方法 5.1无参方法 5.2 有参方法 5.3 获取所有方法(包含Object的方法)

    编写Student类,类中包含学生姓名,学号等私有数据成员。使用JAVA反射机制修改一个学生对象的私有数据成员

    编写Student类,类中包含学生姓名,学号等私有数据成员。 使用JAVA反射机制修改一个学生对象的私有数据成员(不允许调用setters)

    基础深化和提高-java反射技术

    操作字段:通过反射可以获取和设置对象的字段值,包括公有字段、私有字段等。 动态代理:通过反射可以创建动态代理对象,用于实现特定的代理逻辑。 框架和工具:在很多框架和工具中,如Spring框架、JUnit测试框架...

    kevvy-reflect:高性能Java反射

    #####非私有字段 #####私人字段 ##### Bean字段,非私有字段和Java-Getter / Setter比较 ##### Field全家福 ###方法调用: 无效返回且无参数方法 private void testMethod(){ ... } 返回字符串和多参数方法 ...

    day021-反射和注解笔记和代码.rar

    私有化方法、字段、构造方法都必须破坏封装才能使用: public void setAccessible(boolean flag) true表示破坏封装,false是不破坏 是哪个private修饰的方法、字段、构造方法需要执行,就需要用...

    反射机制 上课示例

    获得私有字段 获得构造 (某个,所有) 获得构造参数 获得方法 获得返回类型 获得方法参数 应用 给字段赋值 给私有字段赋值 调用无参数无返回值方法 调用有参数有返回值方法 调用构造来创建实例 有非常详细的注释

    SqlMap自动生成小工具SqlMapAutoGen1.0

    通过java原生的反射机制获取java类的私有字段 1)获取字段名转换成数据库字段名 注意这里有潜规则,默认是这样处理的 createDateTime --> CREATE_DATE_TIME car --> CAR 2)根据字段的java类型获取jdbc类型 我只...

    setAccessible()方法是否破坏了Java的访问规则

    一般情况下,我们并不能对类的私有字段进行操作,利用反射也不例外,但有的时候,例如要序列化的时候,我们又必须有能力去处理这些字段,这时候,我们就需要调用AccessibleObject上的setAccessible()方法来允许这种...

    规范:否ORM(NORM)是一个Java库,用于通过Java安全机制以更加面向SQL的方式使用数据库

    指导原则: SQL查询是以静态方式指定的,其中没有用户数据可以污染它们(即Java批注) 使用具有命名字段和类型字段的Java类(而不是冗长且易于出错的反射接口)将参数和结果(未)编组在一起优先选择编译时间,然后...

    StaticReflection-excercise:带有小型反射练习的静态场行为演示

    小型演示程序,用于在字段对类私有的不太明显的情况下突出静态和非静态字段行为之间的差异。 ##为什么? 静态字段对于每个类加载器都是可见的,因此与特定的类实例完全无关。 换句话说,您可以使用类 A 中的静态...

    GroovyXposedBridge:一个用于创建 Xposed 模块的小型基于 groovy 的 DSL

    制作 DSL 很简单,而且很容易访问类上的私有字段等内容。 大多数 Xposed 模块都会进行大量反射,这使得 Groovy 和 Xposed 成为天作之合。 入门 你会需要: 带有的支持 gradle 的 Android 项目 一个有效的 Xposed ...

    ReflectiveToStringHelper:像 ToStringHelper 但反射!

    ReflectiveToStringHelper(或只是 RTSH – arr tush)使用 Java 的反射功能来获取任何对象的字段并从中生成 toString,无论它们是私有的、包本地的、受保护的还是公共的。 对字段的访问无关紧要。 与其纠结于它是...

    Scala程序设计(第2版)

    11.6 无须区分访问方法和字段:统一访问原则 280 11.7 对象层次结构的线性化算法 282 11.8 本章回顾与下一章提要 287 第12章 Scala集合库 288 12.1 通用、可变、不可变、并发以及并行集合 288 12.1.1...

    reflect:流利的反射-不再需要反射锅炉板

    反映1.0.1 ==== *流光反射-摆脱混乱的锅炉板!...artifactId>reflect</ artifactId>< version>1.0.2-SNAPSHOT</ version></ dependency>野外食谱查找所有字段这将返回所有超类(公共和私有)的所有字段List< F

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    net学习笔记及其他代码应用

    要请求垃圾收集,可以调用下面的方法之一: System.gc() Runtime.getRuntime().gc() 37.String s = new String(\"xyz\");创建了几个String Object? 答:两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。...

Global site tag (gtag.js) - Google Analytics