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

时间:2021-12-14 05:41:53 

尽管我们通常认为通过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,反射,私有方法
0
投稿

猜你喜欢

  • Java解析json报文实例解析

    2023-07-18 21:33:58
  • springboot整合shardingsphere和seata实现分布式事务的实践

    2021-08-10 04:28:37
  • java8 stream中Collectors.toMap空指针问题及解决

    2023-01-16 13:05:28
  • struts2如何使用拦截器进行用户权限控制实例

    2023-02-23 18:14:15
  • Java实现Http工具类的封装操作示例

    2021-08-14 10:27:57
  • Groovy的规则脚本引擎实例解读

    2023-07-11 21:24:04
  • Android ViewPager2 使用及自定义指示器视图实现

    2022-06-16 09:35:26
  • java使用Abobe Acrobat DC生成模板

    2022-04-14 21:03:12
  • mybatis中使用InsertProvider注解报错解决全过程

    2021-06-25 18:36:42
  • MyBatis图文并茂讲解注解开发多对多查询

    2022-10-27 17:05:04
  • java如何通过IP解析地理位置

    2021-09-11 08:01:07
  • C# .NET 中的缓存实现详情

    2023-05-30 18:35:12
  • 详解Spring Data JPA动态条件查询的写法

    2022-03-17 18:26:06
  • Java AtomicInteger类的使用方法详解

    2023-03-09 00:57:57
  • c#操作xml帮助类分享(xml增删改查)

    2022-03-02 04:09:21
  • 详解Java设计模式之备忘录模式的使用

    2023-09-10 09:38:32
  • Java基本数据类型(动力节点java学院整理)

    2022-09-26 12:14:13
  • Mybatis模糊查询之三种定义参数方法和聚合查询、主键回填实现方法

    2023-06-27 03:23:44
  • SpringBoot利用jackson格式化时间的三种方法

    2022-03-26 22:28:56
  • Java动态数组Arraylist存放自定义数据类型方式

    2023-07-25 10:41:30
  • asp之家 软件编程 m.aspxhome.com