什么是反射?

在程序的运行过程中,可以动态的创建对象。

反射的基石是什么?

字节码对象是反射的基石。字节码对象: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反射(一)的更多相关文章

  1. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

  2. Java反射机制

    Java反射机制 一:什么事反射机制 简单地说,就是程序运行时能够通过反射的到类的所有信息,只需要获得类名,方法名,属性名. 二:为什么要用反射:     静态编译:在编译时确定类型,绑定对象,即通过 ...

  3. java反射(基础了解)

    package cn.itcast_01; /** *Person类 */ public class Person {    /** 姓名 */    private String name;     ...

  4. java基础知识(十一)java反射机制(上)

    java.lang.Class类详解 java Class类详解 一.class类 Class类是java语言定义的特定类的实现,在java中每个类都有一个相应的Class对象,以便java程序运行时 ...

  5. java基础知识(十一)java反射机制(下)

    1.什么是反射机制? java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用他的属性和方法,这种动态获取属性和方法的功能称为java的反射机制. ...

  6. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

  7. java反射学习之一反射机制概述

    一.反射机制背景概述 1.反射(reflection)是java被视为动态语言的一个关键性质 2.反射机制指的是程序在运行时能获取任何类的内部所有信息 二.反射机制实现功能概述 1.只要给定类的全名, ...

  8. java反射 之 反射基础

    一.反射 反射:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...

  9. java反射 cglib asm相关资料

    有篇文章对java反射的调用的效率做了测试,写的比较好.猛击下面地址 http://www.blogjava.net/stone2083/archive/2010/09/15/332065.html ...

  10. 超详细的java反射教程

    看技术博客时,看到关于java反射的博文,写的非常好.猛击下面的地址,开始java反射之旅 中文翻译地址:http://ifeve.com/java-reflection/ 英文原版地址:http:/ ...

随机推荐

  1. PyTorch 学习

    PyTorch torch.autograd模块 深度学习的算法本质上是通过反向传播求导数, PyTorch的autograd模块实现了此功能, 在Tensor上的所有操作, autograd都会为它 ...

  2. GitLab 后台修改用户密码

    GitLab 后台修改用户密码 # 打开控制台 gitlab-rails console production # 找到用户,输入密码,确认密码,保存 user = User.find_by(user ...

  3. salesforce零基础学习(九十九)Git 在salesforce项目中的应用(vs code篇)

    本篇参考: https://code.visualstudio.com/docs/editor/versioncontrol https://git-scm.com/doc https://git-s ...

  4. 2020-07-09:mysql如何开启慢查询?

    福哥答案2020-07-09: 1.参数说明 slow_query_log 慢查询开启状态slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般 ...

  5. Vue 自定义VueRouter-简版

    主要是思路,自己定义组件的时候可以借鉴 Vue-router的 类图 name options: ==> 记录构造函数中传入的对象,在 new VueRouter的时候传了一个对象( route ...

  6. 【算法•日更•第三十二期】教你用出windows体验的Linux

    ▎前言 小编昨天闲的不行,就装了一个linux系统,linux的发行版很多,小编认为ubuntu很好用,于是就在使用ubuntu. 没错,我现在就在使用ubuntu来写博客. 刚才还装了一个QQ,不过 ...

  7. hadoop2.6虚拟机安装

    Linux环境设置/*安装Hadoop集群时要确保以下几个方面1.本机与虚拟机之间是否可以通信(Ping).如果不行检查下面 1.1本机防火墙关闭(开启情况是本机可以ping虚拟机,虚拟机不能ping ...

  8. Dubbo系列之 (四)服务订阅(1)

    辅助链接 Dubbo系列之 (一)SPI扩展 Dubbo系列之 (二)Registry注册中心-注册(1) Dubbo系列之 (三)Registry注册中心-注册(2) Dubbo系列之 (四)服务订 ...

  9. (java)剑指offer二维数组中的查找

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从 上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. pu ...

  10. 你想了解的JDK 10版本更新都在这里

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...