Java反射(重要)
全文内容
1: 获取字节码文件对象的三种方式
2: 获取公有,私有方法,并调用构造方法,成员方法
3: 获取并调用私有成员变量
4: 如何为实例对象的成员变量赋值
5: 文末有一些注意
tea1类代码
class tea1{
private String i;
public int j;
public tea1(){}
public tea1(int j){
this.j = j;
}
private tea1(String i,int j){
this.j = j;
this.i = i;
}
@Override
public String toString() {
return "tea1{" +
"i='" + i + '\'' +
", j=" + j +
'}';
}
private void q(){
System.out.println("调用私有成员方法");
}
}
测试类代码
package 学习.反射;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class a {
public static void main(String[] args) throws
ClassNotFoundException, NoSuchMethodException,
IllegalAccessException, InvocationTargetException,
InstantiationException, NoSuchFieldException {
//获取字节码文件对象的三种方式
//一(推荐):foeName()里面是类所在的全路径
//idea可以右键所在类,然后点击copy,然后点击copy reference,行了
Class<?> tea1 = Class.forName("学习.反射.tea1");
//二:通过类对象获取字节码文件对象
tea1 tea11 = new tea1();
Class<?> aClass = tea11.getClass();
//三:通过类名获取字节码文件对象
Class<?> aClass1 = tea1.getClass();
/*
提前补充:
tea1.getConstructor(),这里面的参数是字节码文件对象
举例
Constructor<?> constructor1 = tea1.getConstructor(int.class);
这句意思是:返回了tea1类中的带有一个int参数的构造器,这个构造方法
默认是公有的,私有下面会讲.
举例:Constructor<?> constructor2
=tea1.getConstructor(int.class,String.class);
意思是获取带有两个参数的构造器int与String.
相信大家可以触类旁通
*/
//获取无参构造器
Constructor<?> constructor = tea1.getConstructor();
//获取有参构造器
Constructor<?> constructor1 = tea1.getConstructor(int.class);
/*
在不使用反射机制时,私有的构造方法是在外部无法调用的,拓展一下:比
如饿汉式,懒汉式设计模式,这两种设计模式就是将构造方法私有化了,
可以自己去了解以下,也可以等我更新文章。
Constructor<?> declaredConstructor =
tea1.getDeclaredConstructor(String.class, int.class);
declaredConstructor.setAccessible(true);
第一句是获取了一个私有的构造器对象,不过这个对象有锁
第二句就是破除锁。
*/
//获取私有构造器
Constructor<?> declaredConstructor =
tea1.getDeclaredConstructor(String.class, int.class);
//破除私有
/*
* 可以理解为公有方法在第一步找到对象就可以直接使用,而私有需要打开
* 私有锁,
* setAccessible就是打开锁
* */
declaredConstructor.setAccessible(true);
/*
可以在创建对象的时候传递参数,这个参数数量与类型要与
上边的tea1.getConstructor(int.class)相照应,否则有些运行时会出错
在这是使用上边获得的构造器来创建对象的过程
为了方便大家查看,我把上边代码贴过来了,可以一一对照
*/
//创建对象
//无参
//Constructor<?> constructor = tea1.getConstructor();
Object o = constructor.newInstance();
//有参
// Constructor<?> constructor1 = tea1.getConstructor(int.class);
Object o1 = constructor1.newInstance(1);
/*Constructor<?> declaredConstructor =
tea1.getDeclaredConstructor(String.class, int.class); */
Object a = declaredConstructor.newInstance("a", 1);
//获取方法
//这是获取公有方法,tea1.getMethod("toString")其中toString是类中 的方法名
Method toString = tea1.getMethod("toString");
//这是获取私有方法
Method declaredMethod = tea1.getDeclaredMethod("q");
//破除私有,
declaredMethod.setAccessible(true);
//下面是调用方法
//结构式:方法对象.invoke(实例对象)
//反射,反着写(狗头)
declaredMethod.invoke(o);
//输出3个结果
//使用反射机制调用方法
System.out.println(toString.invoke(o));
//直接输出就是默认调用toString
System.out.println(o1);
System.out.println(toString.invoke(a));
//获取成员变量
//获取公有变量
Field j = tea1.getField("j");
//输出a实例对象的j成员变量
System.out.println(j.get(a));
//私有成员变量
Field i = tea1.getDeclaredField("i");
//破除私有
i.setAccessible(true);
//输出a实例对象的成员变量
//结构:变量对象名.get(实例对象名)
//反射,反着写(狗头)
System.out.println(i.get(a));
//至此,获取构造方法的内容结束
//获取成员变量
//现在,获取实例对象,方法,变量都讲完了
//讲解如何为实例对象的成员变量进行赋值
//不知道大家现在能否看懂
//获取私有成员变量
Field j1 = tea1.getDeclaredField("j");
//破除私有变量
j1.setAccessible(true);
//为成员变量赋值
//j1是成员变量的实例化对象
//o是上文创建的一个对象,我把代码粘贴过来了
//Constructor<?> constructor = tea1.getConstructor();
//Object o = constructor.newInstance();
//结构:成员变量的实例化对象.set(类的实例化对象,对应的成员变量的值)
//400是int,原因是:
//Field j1 = tea1.getDeclaredField("j");
//而j在类中是int类型,一定要类型对应
j1.set(o,400);
//获取并输出o对象的成员变量j的值
System.out.println(j1.get(o));
}
}
注意:可以按照获得私有构造器,私有方法,私有对象的函数处理公有方法,这样不会在一些未知的情况下出错。
推荐大家都使用Class.forName()来获取字节码文件对象。
谢谢大家。
Java反射(重要)的更多相关文章
- 第28章 java反射机制
java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...
- Java反射机制
Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射: 静态编译:在编译时确定类型,绑定对象,即通过 ...
- java反射(基础了解)
package cn.itcast_01; /** *Person类 */ public class Person { /** 姓名 */ private String name; ...
- java基础知识(十一)java反射机制(上)
java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...
- java基础知识(十一)java反射机制(下)
1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...
- java反射学习之二万能EXCEL导出
一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...
- java反射学习之一反射机制概述
一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...
- java反射 之 反射基础
一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- java反射 cglib asm相关资料
有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...
- 超详细的java反射教程
看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...
随机推荐
- AtCoder ABC 242 题解
AtCoder ABC 242 题解 A T-shirt 排名前 \(A\) 可得 T-shirt 排名 \([A+1,B]\) 中随机选 \(C\) 个得 T-shirt 给出排名 \(X\) ,求 ...
- redisson之分布式锁实现原理(三)
官网:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 一.什么是分布式锁 1.1.什么是分布式锁 分布式锁,即分布式系统中的锁 ...
- 轻松上手Fluentd,结合 Rainbond 插件市场,日志收集更快捷
以往有篇文章介绍 EFK(Kibana + ElasticSearch + Filebeat)的插件日志收集.Filebeat 插件用于转发和集中日志数据,并将它们转发到 Elasticsearch ...
- zabbix主动式和被动式
推荐: zabbix我们使用主动式,主动式的话,可以把压力都分散到agent上,压力小. 1: zabbix主动式和被动式是相对于agent来说的. zabbix server去获取zabbix ag ...
- React技巧之组件中返回多个元素
原文链接:https://bobbyhadz.com/blog/react-return-multiple-elements 作者:Borislav Hadzhiev 正文从这开始~ fragment ...
- Linux用户、组 管理
Linux安全模型 3A: Authentication:认证,验证用户身份 Authorization:授权,不同的用户设置不同权限 Accouting|Audition:审计 Linux用户: 管 ...
- jfinal中如何使用过滤器监控Druid监听SQL执行?
摘要:最开始我想做的是通过拦截器拦截SQL执行,但是经过测试发现,过滤器至少可以监听每一个SQL的执行与返回结果.因此,将这一次探索过程记录下来. 本文分享自华为云社区<jfinal中使用过滤器 ...
- NC14247 Xorto
NC14247 Xorto 题目 题目描述 给定一个长度为 \(n\) 的整数数组,问有多少对互不重叠的非空区间,使得两个区间内的数的异或和为 \(0\) . 输入描述 第一行一个数 \(n\) 表示 ...
- halcon 基础总结(一)裁切图片并旋转图像
第一步当然是读取图像了:read_image (Image, 'C:/Users/HJ/Desktop/test_image/b.jpg') 第二步:二值化.二值化.因为我这里的物体是黑色的, ...
- Vite+TS带你搭建一个属于自己的Vue3组件库
theme: nico 前言 随着前端技术的发展,业界涌现出了许多的UI组件库.例如我们熟知的ElementUI,Vant,AntDesign等等.但是作为一个前端开发者,你知道一个UI组件库是如何被 ...