什么是反射?

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

反射的基石是什么?

字节码对象是反射的基石。字节码对象: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. Android 生命周期,解决savedInstanceState一直为null的问题

    在此之前还是补充下关于监听器的两个要点:   向下一个活动传递数据 : button1.setOnClickListener(new View.OnClickListener() { @Overrid ...

  2. Python稳居编程语言榜首,看完这篇总结,你就明白为什么要学它了

    最近,网上流传一组<人工智能实验教材>的图片,照片火起来的原因是教材是为幼儿园的小朋友们设计的! Python被列入小学.初高中教材已不是新鲜事,现在又成功“入侵”了幼儿园,对此有网友调侃 ...

  3. Python面向对象编程扑克牌发牌程序,另含大量Python代码!

    1. 题目 编写程序, 4名牌手打牌,计算机随机将52张牌(不含大小鬼)发给4名牌手,在屏幕上显示每位牌手的牌. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不 ...

  4. Python内置OS模块用法详解

    大家好,从今天起早起Python将持续更新由小甜同学从初学者的角度学习Python的笔记,其特点就是全文大多由新手易理解的代码与注释及动态演示.刚入门的读者千万不要错过! 很多人学习python,不知 ...

  5. JVM与Java体系结构

    参考笔记:https://blog.csdn.net/weixin_45759791/article/details/107322503 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问 ...

  6. 洛谷P3513 [POI2011]KON-Conspiracy

    洛谷P3513 [POI2011]KON-Conspiracy 题目描述 Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动. 国王需要选一些人来进行这场运动,而这些人被分为 ...

  7. stat 命令家族(2)- 详解 pidstat

    性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 对 Linux 任务的统计 ...

  8. 怎么把txt转换成excel

    地址: https://jingyan.baidu.com/article/c1465413b2f2c50bfdfc4c61.html

  9. 手把手mc开服教学(内置开服核心)

    QQ交流群:1125669835 mc开服教程 首先我们需要下载一个开服核心,然后把服务器核心放在一个空文件夹里(这是我的开服核心) 然后再打开(感jio这是废话,要耐心等待......) 然后你会发 ...

  10. PAT 2-08. 用扑克牌计算24点(25):

    题目链接:http://www.patest.cn/contests/ds/2-08 解题思路:思路参考24点游戏技巧http://www.24game.com.cn/articles/points2 ...