Java 反射获取私有方法
通常我们创建一个类时,它的私有方法在类外是不可见的,但是可以通过反射机制来获取调用。具体的反射机制的介绍大家自己百度。
所以反射可能会破坏我们的单例模式,当然解决方案也是有的,就是做个标记记录次数,第二次调用私有构造器的时候抛出异常就可以了。这里就不详细说明了。
首先我们创建一个需要被反射的类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 反射获取私有方法的更多相关文章
- c# 通过反射获取私有方法
class Program { static void Main(string[] args) { //通过反射来调私有的成员 Type type = typeof(Person); //Bindin ...
- java反射调用私有方法和修改私有属性
//调用私有方法package com.java.test; public class PrivateMethod { private String sayHello(String name) { r ...
- Android(java)学习笔记108:通过反射获取私有构造方法并且使用
反射获取私有构造方法并且使用: 1.获取字节码文件.class对象: Class c = Class.forName("cn.itcast_01.Person") ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...
- Android(java)学习笔记49:通过反射获取私有构造方法并且使用
1. 反射获取私有构造方法并且使用: (1)获取字节码文件.class对象: Class c = Class.forName("cn.itcast_01.Person&qu ...
- Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别
Java反射获取对象成员属性,getFields()与getDeclaredFields()方法的区别 在工作中遇到一个问题,就是你需要去判断某个字符串是不是对象的某个成员属性名,然后根据判断结果 ...
- java通过反射获取私有的构造方法,及反射擦除泛型数据类型约束
/* * 反射获取私有的构造方法运行 * 不推荐,破坏了程序的安全性,封装性 * 暴力私有 */ public class ReflectDemo4 { public static void main ...
- 2019-4-16-C#-使用反射获取私有属性的方法
title author date CreateTime categories C# 使用反射获取私有属性的方法 lindexi 2019-4-16 10:13:3 +0800 2018-09-26 ...
- JUnit 3.8 通过反射测试私有方法
测试私有(private)的方法有两种: 1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳 2)通过反射 (推荐) 代码演示: 目标程序 Priva ...
随机推荐
- 【网络是怎么连接的】一、浏览器与HTTP协议
浏览器: 1.生成HTTP消息: 1).网址结构: http://user:password@www.glasscom.com:80/dir/file1.htm 2).HTTP服务基本思路: a).请 ...
- Linux监控cpu,内存,磁盘脚本
#!/bin/bash # CPU_us=$(vmstat | awk '{print $13}' | sed -n '$p') CPU_sy=$(vmstat | awk '{print $14}' ...
- Openstack组件部署 — keystone(domain, projects, users, and roles)
目录 目录 前文列表 Create a domain projects users and roles domain projects users and roles的意义和作用 Create the ...
- 2019ccpc网络赛hdu6703 array(线段树)
array 题目传送门 解题思路 操作1是把第pos个位置上的数加上\(10^7\),操作2是找到区间[1,r]中没有且大于k的最小的数.注意到k的范围是小于等于n的,且n的范围是\(10^5\),远 ...
- Pandas数据处理 学习
pandas是在numpy的基础上建立的新程序库,提供了一种高效的DataFrame数据结构. DataFrame本质上是一种带行标签和列标签.支持相同数据类型和缺失值的多维数组. 先看版本信息: p ...
- 泛微weaver_oa filebrowser.jsp 任意目录遍历
url//document/imp/filebrowser.jsp?dir=/etc/
- Jackson教程
Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象.Jackson所依赖的jar包较少,简 ...
- mysql 5.7.20 取得动态sql执行结果
drop procedure test; delimiter ;; CREATE procedure test() -- 取动态sql的值 begin ); ); set v_sqlcounts = ...
- NOI 2018 Day1 T1 归程
题面见洛谷 难点: 走过有积水的地方之后就需计算路径长了 关键算法: kruskal重构树 ①原来的 kruskalkruskalkruskal 算法就是用并查集实现的, 但当我们使用 krus ...
- 10-vim-选中命令-01-三种选择文本的方式
选择文本(可视模式) 学习复制命令前,应该先学会如何选中要复制的代码. 在vi中要选择文本,需要先使用visual命令切换到可视模式. vi中提供了三种可视模式. 按ESC可以放弃选中,返回到命令模式 ...