优秀的编程知识分享平台

网站首页 > 技术文章 正文

java之反射(1)(反射机制java)

nanyue 2024-09-20 21:44:35 技术文章 3 ℃

#头条创作挑战赛#

一、前言

我们在JVM虚拟机中创建后缀.java的文件,然而 .java文件是不能被电脑识别出来的。所以要进行编译运行,就会产生一个后缀为 .class的字节码文件。

这个 .class是一个16进制字节码文件。包含了类的所有信息等。

而我们今天要说的反射,就是用来操作和修改 .class文件的。

二、反射

java.lang.Class就是代表反射类,代表整个字节码操作类,里面api就是用来操作字节码文件的。既然要操作字节码文件,那我们该怎么获取呢?

1、 获取字节码文件的三种方式

1)通过路径获取

Class a = Class.forName("java.lang.String");
Class b = Class.forName("com.example.dao.User");

当用Class.forName获取字节码文件时,类中的静态代码块就会执行,并且只执行一次。

例如:建一个User类

public class User {
    static {
        System.out.println("我是静态代码块");
    }
}
public class Client {
    public static void main(String[] args) throws Exception {
        Class.forName("org.example.dao.User");
    }
}

输出:我是静态代码块

2)必须通过实例对象取得字节码文件;使用getClass();getClass是Object自带的函数,所以对所有对象都继承了。

Student s = new Student();
Class a = s.getClass() // 即可得到Student.class字节码文件

3)不管是基本类型还是引用类型,本身都有.class属性,即直接可以获取。

Class s = String.class; // 得到String字节码文件
Class i = int.classs;
Class d = Date.class; // 得到Date日期字节码文件
Class a = Animal.class; // 得到名为Animal类型的字节码文件

2、创建字节码实例对象

用newInstance()创建实例对象,newIntance会调用例如下面User类的无参构造,所以所创建实例对象的类(User)必须有无参构造函数。

public class User {
    public User(){}
}

如果没有无参构造就会报错:

public class User {
    String age;
    public User(String age){
        this.age = age;
    }
}
Class b = Class.forName("com.example.dao.User"); 
Object obj = b.newInstance();

Class b = Class.forName("com.example.dao.User");是获取到字节码文件。

Object obj = b.newInstance();将字节码文件实例化

最近发表
标签列表