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:/ ...
随机推荐
- JAVA的基本程序设计结构<上>
一个简单的Java应用程序 public class FirstSample { public static void main(String[] args) { System.out.println ...
- 100例Python代码带你从入门到进阶!
以下所有代码全都至少运行一遍,确保可复现.易于理解.逐步完成入门到进阶的学习. 此教程经过我 反复打磨多遍 ,经常为此熬夜,真心不易,文章比较长,看完有用,帮我点个在看或分享支持. 教程包括 62 个 ...
- Typora 完美结合 PicGo,写作体验更佳!
写在前面 在众多 md 编辑器中,Typora 是大家公认的体验较好的写作软件之一,它最大的特点就是:所见即所得,无须分屏预览,或者开启新页面预览.除此之外,还有很多优点,这里不做介绍,不是本文的重点 ...
- 关于css布局中,inline-block元素间隙的处理方法
关于inline-block元素间隙的处理 参考橱窗外的小孩,原文链接https://www.cnblogs.com/showcase/p/10469361.html 如下,两个inline-bloc ...
- 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式
1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...
- C#图解教程(第四版)—01—类型,存储,变量
3.1 如何广泛的描述C#程序 可以说C程序是一组函数和数据类型,C++程序是一组函数和类,然而C#程序是一组类型声明 3.2 类型 可以把类型想象成一个用来创建数据结构的模板,模板本身并不是数据结构 ...
- hdfs学习(一)
一.hdfs概述 介绍: 在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储.统一管理分布在集群上的文件系统称为分布式文件系统 .HDFS(Hadoop Distributed File ...
- mysql基础测试题
mysql基础测试题:https://www.cnblogs.com/wupeiqi/articles/5729934.html 如何创建表? 就这样类推?如何提取我们想要的元素呢? 综合提取呢?
- node-sass 报错的解决方法
今天在运行项目发现原来好好的项目报错了.报错大致信息如下: 这段代码是我升级node之后里面根据不同的项目位置什么的会有所不同. 简单的说,这段代码意思是node-sass 不兼容 node v8 的 ...
- AVL树旋转
什么是AVL树? AVL树是带有平衡条件的二叉查找树,一颗AVL树首先是二叉查收树(每个节点如果有左子树或右子树,那么左子树中数据小于该节点数据,右子树数据大于该节点数据),其次,AVL树必须满足平衡 ...