Java 获得字节码文件对象的三种方式

        ClassReflectExercise

package ClassReflect20240831;

public class ReflectExercise1 {
    public static void main(String[] args) throws ClassNotFoundException {
        // 反射:
        // 在运行状态中,对于任意一个类,都可以知道该类的所有属性和方法
        // 对于任意一个对象,都能够调用其任意属性和方法
        // 这种动态获取信息以及动态调用对象方法的功能就是Java的反射机制
        // 通过反射创建对象可以无视权限修饰符而调用类中的内容

        // 反射都是从class字节码文件中获取的内容

        // 1.最常用:Class类中的静态方法  forName(全类名)   全类名:包名 + 类名
        // 2.类名 + .class
        // 3.对象中的方法:getClass()   该方法需要实例化对象

        // 因为class字节码文件在硬盘中是唯一的,所以说三种方法获得的class对象是同一个

        Class<?> class1 = Class.forName("ClassReflect20240831.Student");
        // 会抛出异常:ClassNotFoundException

        Class<?> class2 = Student.class;

        Student student = new Student();
        Class<?> class3 = student.getClass();

        System.out.println(class1 == class2 && class2 == class3);

        // Java文件:自己编写的Java代码
        // class字节码文件:Java文件经过编译之后,产生的class文件,是存储在硬盘中的,也是JVM虚拟机实际运行的文件
        // class字节码文件对象:当class文件加载进入内存之后,JVM自动创建出来的对象,至少包含:类的构造方法,成员变量,成员方法

        // 反射获取的就是class字节码文件对象,这个对象在内存中是唯一的,所以说无论用什么方法获取的都是同一个对象
    }
}

        Student

package ClassReflect20240831;

public class Student {
    private String name;
    private String gender;
    public int age;

    public Student() {}

    private Student(String name){
        this.name = name;
    }

    private Student(int age){
        this.age = age;
    }

    private Student(String name, String gender){
        this.name = name;
        this.gender = gender;
    }

    public Student(String name, String gender, int age) {
        this.name = name;
        this.gender = gender;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                '}';
    }

    public void eat(String food) {
        System.out.println("学生" + this.name + "正在吃" + food);
    }

    private void study() {
        System.out.println("学生" + this.name + "正在学习");
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值