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:/ ...
随机推荐
- frp 用于内网穿透的基本配置和使用
frp 用于内网穿透的基本配置和使用 今天是端午节,先祝端午安康! frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内网服务以安全.便 ...
- 2020.10.24【普及组】模拟赛C组 总结
T1:暴力 1:先从 6 个中选三个,再把选出的三个全排列,全排列后再判断是否可行 2:把 6 个全都全排列,然后判断 T2:判断误差 1:减法时结果加上 1e-8 2:把小数乘上 1e6 左右 考试 ...
- 使用 .NET MAUI 创建移动应用——Get Start
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 1.IDE下载安装 如果你还没安装Visual Studio 2022 预览版 你 ...
- php7.1 安装amqp扩展
在php开发中使用rabbitmq消息队列时,需要安装PHP扩展amqp,安装步骤如下: 直接使用pecl进行amqp扩展的安装, /usr/local/php/bin/pecl install am ...
- Xilinx DMA的几种方式与架构
DMA是direct memory access,在FPGA系统中,常用的几种DMA需求: 1. 在PL内部无PS(CPU这里统一称为PS)持续干预搬移数据,常见的接口形态为AXIS与AXI,AXI与 ...
- python之单元测试unittest
一.unittest主要内容 主要核心部分:test case, test suite, test runner, test fixture 二.实例 my_class.py文件如下: class F ...
- React基础中的单一标签包裹的问题
先上一段代码: <div id="example"> </div function HelloMessage(props1) { return (<h1&g ...
- 安装ImageMagick7.1库以及php的Imagick扩展
由于ImageMagick7以下不支持heic等图片格式,所以重新安装了ImageMagick7.1版本支持heic格式,并写此文章记录一下. 如果安装过程中遇到一些未知的错误,https://ima ...
- Spring Data JPA系列4——Spring声明式数事务处理与多数据源支持
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第四篇了,先来回顾下前面三篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
- 【python基础】第07回 运算符和流程控制 2
本章内容概要 1.逻辑运算符补充 2.循环结构 本章内容详解 1.逻辑运算符补充 两边都不为0的情况 or 直接取前面的值 and 直接取后面的值如果存在0的情况 and 直接取0 or 直接取非0 ...