Java反射(一)
什么是反射?
在程序的运行过程中,可以动态的创建对象。
反射的基石是什么?
字节码对象是反射的基石。字节码对象:Java类文件通过javac进行编译后生成的xxx.class文件,此文件由jvm加载至内存中,字节码文件就由此变成了字节码文件对象。
字节码对象的类型是什么?
字节码对象的类型为Class,此处Class并非是我们平时创建Java文件时所生成的class,这里专指Java文件的一种类型即引用数据类型。
如何获得对象的字节码文件对象?
1、通过Object类的getClass()方法。由于所有的类是继承自Object类,所以所有的引用类都可以使用此方法。
Class clazz = testController.getClass();
2、通过类型的class属性。
Class clazz = String.class;
3、Class类的forName()方法。注意forName中的类名需要全类名即:包名+类名
Class clazz2 = Class.forName("java.lang.String");
同一个类的不同对象获取到的字节码对象是否是同一个?
TestController testController = new TestController();
TestController testController2 = new TestController();
Class clazz = testController.getClass();
Class clazz2 = testController2.getClass();
System.out.println("testController-->" + clazz);
System.out.println("testController2-->" + clazz2);
System.out.println(clazz.equals(clazz2));

通过测试得到的答案是相同的字节码对象。因为在字节码文件被加载到内存中后,被jvm进行编译加载会根据对应类的class创建的文件对象。所以当我们每new一次,JVM不会再帮我们再重新加载一次。
字节码文件什么时候被加载?
1、new一个类的时候会被加载。相同的类型在进行第二次new的时候将不再加载。
2、访问一个类的静态成员的时候。
3、调用一个类的静态方法的时候。
4、调用发射的方式创建一个类的字节码对象的时候。
5、创建一个子类对象的时候。
6、Java命令执行一个字节码的时候。
字节码文件对象的组成
字节码文件对象由class类生成,则类中又包含了构造方法、成员方法、成员变量。因此字节码文件对象会包括:构造方法对象Constructor、成员方法对象Method、成员变量对象Field。
如何获取构造方法对象、成员方法对象、成员变量对象?
public class Test {
private int a = 2;
private String name;
private String passWord;
private String mobile;
public Test(){}
public Test(String name){
this.name = name;
}
private Test(String name, String passWord){
this.name = name;
this.passWord = passWord;
}
public Test(String name, String passWord, String mobile) {
this.name = name;
this.passWord = passWord;
this.mobile = mobile;
}
public static void main(String[] args) {
Test test = new Test();
Class<? extends Test> clazz = test.getClass();
System.out.println("----------------------Constructor--------------------------");
// 得到使用public修饰的构造方法对象
Constructor<?>[] constructors = clazz.getConstructors();
for (Constructor<?> constructor : constructors) {
System.out.println(constructor);
}
System.out.println("----------------------Method--------------------------");
// 得到使用public修饰的成员方法对象
Method[] methods = clazz.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("----------------------Field--------------------------");
// 得到所有的成员变量对象
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
}
}

由执行结果我们可以清晰的看到,在进行对构造方法对象进行获取的时候,使用getConstructors(),并没由获取到private修饰的构造方法,但是我们可以使用getDeclaredConstructors()方法获取所有的构造方法。
可根据名称获取具体的构造方法对象,如:
Test test = new Test();
Class<? extends Test> clazz = test.getClass();
System.out.println("----------------------Constructor--------------------------");
Constructor<? extends Test> declaredConstructor = clazz.getDeclaredConstructor(String.class, String.class);
System.out.println(declaredConstructor);

由此我们可以确定是用getDeclaredConstructors()方法获取到了private修饰的构造方法,对于像成员方法即成员变量对象都是相同的用法。
如何使用反射创建一个对象?
Test test = new Test();
Class<? extends Test> clazz = test.getClass();
System.out.println("----------------------Constructor--------------------------");
// 得到使用public修饰的构造方法对象
Constructor<? extends Test> declaredConstructor = clazz.getDeclaredConstructor(String.class, String.class);
//暴力破解,设置其他类可以正常访问Test类的private方法
declaredConstructor.setAccessible(true);
Test instance = declaredConstructor.newInstance("张三", "123456");
System.out.println(instance);
此处一定要注意,当我们在其他类中要使用反射去创建对应的类时一定需要指定访问权限,不然无法访问。
由此可以看出,我们成功的通过反射通过Test的私有构造方法创建了一个Test实例。
如果觉着不错,可以关注公众号:Java秃头猿,定期更新只分享对我们日常开发有帮助的东西。

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:/ ...
随机推荐
- 迷之自信的Single_User Mode
Alter database Set Single_User 对于任何DBA来说,恐怕都不陌生.在我们需要获取数据库独占访问权来做一些数据库紧急维护的时候,这可能是大多数DBA的首选,但它真的可以实现 ...
- C#LeetCode刷题之#225-用队列实现栈(Implement Stack using Queues)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4106 访问. 使用队列实现栈的下列操作: push(x) -- ...
- C#LeetCode刷题之#118-杨辉三角(Pascal‘s Triangle)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3688 访问. 给定一个非负整数 numRows,生成杨辉三角的前 ...
- Flutter 容器(8) - SizedOverflowBox | OverflowBox
SizedOverflowBox: 子组件在超出SizedOverflowBox指定的宽高时,不会隐藏,依然进行绘制 OverflowBox: 限制子组件的宽高. import 'package:fl ...
- 一、常用的Dos命令
# 查看目录下所有文件 dir # 切换目录 cd cd .. //返回上一级 # 清理屏幕 cls # 查询电脑ip地址 ipconfig # 退出终端 exit # 创建文件夹 md test # ...
- FCIS:Fully Convolutional Instance-aware Semantic Segmentation
论文:Fully Convolutional Instance-aware Semantic Segmentation 目录 0.简介 1.Position-sensitive Score Map ...
- Mybatis 循环删除/插入
<foreach collection="array" open="(" separator="," close=")&qu ...
- IDEA编写Scala代码时自动显示变量类型
设置方法如下:settins -->Editor--> Code Style --> scala --Type Annotations 勾选框选部分 测试效果
- Jmeter 常用函数(25)- 详解 __V
如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 执行变量名表达式,并返回执行结果 它可 ...
- C++ Templates (1.2 模板实参推断 Template Argument Deduction)
返回完整目录 目录 1.2 模板实参推断 Template Argument Deduction 1.2 模板实参推断 Template Argument Deduction 当调用函数模板(如max ...