通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用。具体的反射机制的介绍大家自己百度。

所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第二次调用私有构造器的时候抛出异常就可以了。这里就不详细说明了。

首先我们创建一个需要被反射的类Person.java。它有默认构造器和带参数构造器,以及私有方法。

package com.test;

/**
* @program: java数据结构
* @description: 人类
* @author: Wu Lei
* @create: 2018-10-25 09:58
*/
public class Person {
private int age;
private String name; public Person(){}; public Person(int age, String name){
this.age = age;
this.name = name; } public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void say(){
System.out.println("你好啊!公有方法!");
} private void say2(){
System.out.println("你好啊!私有方法!");
} @Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}

创建一个测试类:

package com.test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method; /**
* @program: java数据结构
* @description: java反射demo
* @author: Wu Lei
* @create: 2018-10-25 09:58
*/
public class ReflectionTest {
public static void main(String[] args) {
Class clazz = Person.class;
Field [] fields =clazz.getDeclaredFields();
System.out.println("获取到的字段数组:");
for(Field f : fields){
System.out.println(f.toString());
}
try {
Person p = (Person) clazz.newInstance();//调用默认构造方法
p.setAge(15);
p.setName("test");
System.out.println("调用默认的构造方法:");
System.out.println(p.toString()); Constructor constructor = clazz.getDeclaredConstructor(int.class,String.class);//获取指定参数类型的构造函数
Person p2 = (Person) constructor.newInstance(13,"xiaoming");
System.out.println("调用指定参数类型的构造方法:");
System.out.println(p2); Method method = clazz.getDeclaredMethod("say2");//获取指定方法,包括私有方法
method.setAccessible(true);//获取私有权限
method.invoke(p2); Method method1 = clazz.getMethod("say");//获取有权限的方法,包括父类的
method1.invoke(p); } catch (Exception e) {
e.printStackTrace();
} }
}

Method的setAccessible()方法可以绕过私有的安全检查,所以我们就可以调用类的私有方法啦。

最新文章

  1. 关于iOS10的允许访问用户数据产生的问题
  2. Ubuntu 14 编译安装 PHP 5.4.45 + Nginx 1.4.7 + MySQL 5.6.26 笔记
  3. 苹果App Store审核指南中文翻译(2014.9.1更新)
  4. C# 控件双缓冲控制 ControlStyles 枚举详解
  5. poj 1236 Network of Schools
  6. vxworks一个超级奇怪的错误(parse error before `char')
  7. ADI加速度计基础原理
  8. linux中运行python
  9. FIDO联盟:我们将杀死密码
  10. 关于window.history.back()后退问题
  11. Python爬虫(十四)_BeautifulSoup4 解析器
  12. 配置Meld为git的默认比较工具
  13. BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]
  14. 图像分割之(四)OpenCV的GrabCut函数使用和源码解读
  15. rac备份及恢复的重要概念之一——Redo Threads和Streams
  16. NALU数据打RTP包流程详解
  17. 我的母校zbvc试做
  18. Loj10154 选课
  19. html 禁用点击事件
  20. 訪问可能没有定义的data (通过static类型flash.net:FileReference引用)

热门文章

  1. POJ 1789 Truck History (Kruskal)
  2. HBase 入门之数据刷写(Memstore Flush)详细说明
  3. vue父组件与子组件之间的数据传递
  4. Django框架(十七)—— 中间件、CSRF跨站请求伪造
  5. 42-python基础-python3-字符串-原始字符串
  6. CSS中的块级元素和行内元素
  7. 自己写IRP,做文件操作,遇到的坑
  8. Javascript高级程序设计--读书笔记之面向对象(二)
  9. Arch安装墨刀(产品原型工具)
  10. Postfix+Dovecot+MySQL搭建邮件服务器