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

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

首先我们创建一个需要被反射的类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()方法可以绕过私有的安全检查,所以我们就可以调用类的私有方法啦。

Java 反射获取私有方法的更多相关文章

  1. c# 通过反射获取私有方法

    class Program { static void Main(string[] args) { //通过反射来调私有的成员 Type type = typeof(Person); //Bindin ...

  2. java反射调用私有方法和修改私有属性

    //调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { r ...

  3. Android(java)学习笔记108:通过反射获取私有构造方法并且使用

    反射获取私有构造方法并且使用: 1.获取字节码文件.class对象:          Class c = Class.forName("cn.itcast_01.Person") ...

  4. Java 反射 调用私有域和方法(setAccessible)

    Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...

  5. Android(java)学习笔记49:通过反射获取私有构造方法并且使用

    1. 反射获取私有构造方法并且使用: (1)获取字节码文件.class对象:          Class c = Class.forName("cn.itcast_01.Person&qu ...

  6. Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别

    Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 ​ 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...

  7. java通过反射获取私有的构造方法,及反射擦除泛型数据类型约束

    /* * 反射获取私有的构造方法运行 * 不推荐,破坏了程序的安全性,封装性 * 暴力私有 */ public class ReflectDemo4 { public static void main ...

  8. 2019-4-16-C#-使用反射获取私有属性的方法

    title author date CreateTime categories C# 使用反射获取私有属性的方法 lindexi 2019-4-16 10:13:3 +0800 2018-09-26 ...

  9. JUnit 3.8 通过反射测试私有方法

    测试私有(private)的方法有两种: 1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳 2)通过反射 (推荐) 代码演示: 目标程序 Priva ...

随机推荐

  1. 性能测试基础 ---TCP通信过程的状态码与过程,以及出现错误码的分析(TIME_WAIT,CLOSE_WAIT)

    TCP通信过程 如下图所示,TCP通信过程包括三个步骤:建立TCP连接通道(三次握手).数据传输.断开TCP连接通道(四次挥手). 这里进一步探究TCP三路握手和四次挥手过程中的状态变迁以及数据传输过 ...

  2. ansible 远程执行时提示 command not found 问题

    问题 最近在学习 ansible ,在使用普通用户远程执行 ip a 命令是发现提示错误:/bin/sh: ip: command not found. 原因 command not found 命令 ...

  3. 【转】开源框架是如何通过JMX来做监控的(一) - JMX简介和Standard MBean

    原文链接:https://www.cnblogs.com/trust-freedom/p/6842332.html#autoid-0-0-0 相信很多做Java开发的同学都使用过JDK自带的 jcon ...

  4. jquery中attr方法和prop方法的区别

    关于checked的属性,最重要的概念就是你要记住,它跟checked的状态值是毫无关系的,设置checked = "checked"或者checked = "true& ...

  5. linux less preserve colors

    less -r grep pattern file.txt --color=always | less -r

  6. lg5169 xtq的异或和

    题目 根据一些众所周知的结论,我们先跑一棵生成树出来,之后把所有简单环都搞出来,那么\(u\)到\(v\)的路径一定可以由树上的路径和一些简单环拼起来得到 把所有简单环都插到一个线性基里,之后dfs一 ...

  7. Joda-Time 入门

    Joda-Time 令时间和日期值变得易于管理.操作和理解.事实上,易于使用是 Joda 的主要设计目标.其他目标包括可扩展性.完整的特性集以及对多种日历系统的支持.并且 Joda 与 JDK 是百分 ...

  8. android中的国际化

    java国际化步骤: 定义资源文件: baseName_language_country.properties baseName_language.properties baseName.proper ...

  9. ListView封装实现下拉刷新和上拉加载(方式2)(转载)

    转自:http://blog.csdn.net/jdfkldjlkjdl/article/details/70229465 这次使用的是系统的SwipeRefreshLayout实现下拉刷新,和设置L ...

  10. asp.net网站Application_Start疑是不执行的现象

    今天遇见了一个很诡异的事情,发布了新代码后,发现在Application_Start中读取的一些配置参数变为空了,最开始我以为是什么特殊的原因程序没有执行Application_Start,导致它们的 ...