Java基础第十天

该文档是:Luo学习Java笔记...

博客连接:https://www.loveuluo.cn

日期:2020-11-16

扩展:什么是字节码

字节码是java编译后产生的,是一种二进制文件。

编写一个简单的Hello.java文件:

public class Hello {

    public static void main(String[] args) {
        System.out.println((args.length > 0) ? args[0] : "Hello");
    }
}

在命令行执行 javac Hello.java 即可编译出class文件,为 Hello.class 文件。

然后执行 java Hello 即可运行这个class文件(注意不要加.class)。

其中 javap 命令可以分解查看class文件

字节码是指的java程序编译后的结果。是一组8位字节为基础单位的二进制流字节码是直接运行在jvm的平台上(字节码跨平台),不是直接运行在操作系统上的二进制文件。jvm解释执行字节码,转换为对应平台的操作。

img

1. 反射概述

image-20201116145808552

2. 获取Class的三种方式

三种方式:

image-20201116151917240

内存图:字节码文件装载到jvm的时候只装载一份,同一类型获得的字节码指向方法区中的同一个字节码文件。

image-20201116145514717

3. 通过反射实例化对象

newInstance方法会调用User类的无参构造方法创建对象,如果设置了有参构造方法,无参构造方法就没了,就会报错(实例化异常),

必须手动补上无参构造方法,所以建议创建类的时候无参和有参构造方法都写上(Idea一键生成)。

image-20201116155500802

3.1 为什么用反射实例化对象,不直接new对象呢,反射比较灵活(验证反射机制的灵活性例子):

比较灵活,只需要修改配置文件不需要修改源代码,就可以创建出不同的实例对象。

配置文件内容:

image-20201116162634324

代码:

image-20201116162406069

扩展:文件路径

直接这样写死路径不好,因为将来有可能将代码移植到linux或者别的地方上,需要修改的灵活一点。

image-20201116165304530

文件列表:

image-20201116165226477

代码:

image-20201116171006088

直接以流的方式直接返回

image-20201116182028601

资源绑定器

image-20201116182553426

扩展:类加载器概述

image-20201116183533087

4. 只希望某一个类的静态代码块执行,不需要其他程序执行,可以使用Class.forname()

image-20201116163533768

测试类:

image-20201116163639684

5. 通过反射获取Field(了解即可)

学生类:

image-20201116185941783

测试类:

image-20201116190129729

image-20201116190226200

6. 通过反射反编译Field(了解即可)

image-20201116193137482

7. 通过反射机制访问对象属性(重要**)

为什么用这种方法,而不用new,用反射的话灵活性比较高,可以把所有要赋值的玩意写入配置文件中,可以给某一个对象某一个类型对象的某一个属性赋值!

image-20201117101354582

可以访问私有的属性值:

image-20201117101411573

扩展:可变长参数

image-20201117103057346

image-20201117103112416

8. 反射Method(了解即可)

反射Method代码:

image-20201117104347112

类里边存在的方法:

image-20201117104403686

9. 反编译Method(了解即可)

image-20201117105225619

10. 通过反射机制调用方法(最重要*

返回值就是方法的返回值,比如通过反射调用了public int add(int a,int b){return a+b}这个方法,那么这个a+b就是反射四要素中的返回值,返回的会是一个Object类型。

测试类:
以下是通过反射调用了业务类中的login方法(根据参数名分辨调用的是哪个方法,因为可能同方法名不同参数),所以返回值就是boolean,也就是true或者false,不过invoke方法它不知道你的返回值是什么,所以直接返回所有类型的父类Object。

image-20201117110632213

这是用户业务类里边有方法:

image-20201117110757392

11. 反编译构造方法(了解即可)

image-20201117152147866

12. 通过反射获取父类和父接口(小重点*)

image-20201117155721180

最后修改:2020 年 12 月 25 日 06 : 58 PM
如果觉得我的文章对你有用,请随意赞赏