嘉明的Java学习(15)之反射

反射的概念以及应用

在这里插入图片描述

反射的概述

在这里插入图片描述

每个.java文件对应一个.class文件。每个.class文件对应一个class对象
一个类的字节码文件只会被加载一次

    public static void main(String[] args) throws ClassNotFoundException {
       //方式一
       Student s = new Student();
       Class clazz = s.getClass();
       //方式二
        Class clazz2 = Student.class;
        //方式三
        Class clazz3 = Class.forName("cn.reflex1.demo.Student");

        System.out.println(clazz == clazz2);
        System.out.println(clazz2 == clazz3);
        System.out.println(clazz == clazz3);
    }
}

在这里插入图片描述

反射方式获取构造方法并使用

在这里插入图片描述

public class Student {
    public Student() {
    }

    public Student(String name) {
        System.out.println("您输入的名字是:" + name);
    }

    private Student(int age) {
        System.out.println("您输入的年龄是:" + age);
    }
}
import java.lang.reflect.Constructor;

public class test2  {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("cn.reflex1.demo.Student");
        Constructor con = clazz.getConstructor();
        System.out.println(con);
        System.out.println("--------------------------------");
        Constructor con2 = clazz.getConstructor(String.class);
        System.out.println(con2);
        System.out.println("--------------------------------");
        Constructor con3 = clazz.getDeclaredConstructor(int.class);//这个可以访问私有的构造函数
        System.out.println(con3);
        System.out.println("---------------------------------");
        Constructor con4[] = clazz.getConstructors();//只能访问共有的构造函数,私有构造函数的不可以访问
        for (Constructor constructor : con4) {
            System.out.println(constructor);
        }
        
    }
}

在这里插入图片描述

使用构造方法

import java.lang.reflect.Constructor;

public class test2  {
    public static void main(String[] args) throws Exception {
 /*     Class clazz = Class.forName("cn.reflex1.demo.Student");
        Constructor con = clazz.getConstructor();
        System.out.println(con);
        System.out.println("--------------------------------");
        Constructor con2 = clazz.getConstructor(String.class);
        System.out.println(con2);
        System.out.println("--------------------------------");
        Constructor con3 = clazz.getDeclaredConstructor(int.class);//这个可以访问私有的构造函数
        System.out.println(con3);
        System.out.println("---------------------------------");
        Constructor con4[] = clazz.getConstructors();//只能访问共有的构造函数,私有构造函数的不可以访问
        for (Constructor constructor : con4) {
            System.out.println(constructor);
        }*/
        Class clazz2 = Class.forName("cn.reflex1.demo.Student");
        Constructor con1 = clazz2.getConstructor(String.class);
        String name = con1.getName();
        System.out.println(name);
        Student stu = (Student)con1.newInstance("张三");
        System.out.println(stu);
    }
}

在这里插入图片描述

反射方式获取和使用成员方法

在这里插入图片描述


public class Stu {
    private String name;

    public  Stu(){}

    public Stu(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Stu{" +
                "name='" + name + '\'' +
                '}';
    }
}


import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

public class test4 {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("cn.reflex1.demo.Stu");
        Constructor con = clazz.getConstructor();
        Stu s = (Stu)con.newInstance();
        Method method = clazz.getMethod("setName", String.class);
        method.invoke(s,"法外狂徒张三");
        System.out.println(s);
    }
}

在这里插入图片描述

通过反射方式获取以及使用成员变量

在这里插入图片描述

public class Students {
    public String name;
    private int age;

    public Students() {
    }

    @Override
    public String toString() {
        return "Students{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class test5 {
    public static void main(String[] args) throws Exception {
        //获取类对象
        Class clazz = Class.forName("cn.reflex1.demo.Students");
        //获取构造器并使用
        Constructor con = clazz.getConstructor();
        Students stu = (Students)con.newInstance();//使用
        //获取公有成员变量并使用
        Field field = clazz.getField("name");
        field.set(stu,"张三");//使用
        //获取私有成员变量并使用(记得用暴力反射打开访问权)
        Field field2 = clazz.getDeclaredField("age");
        field2.setAccessible(true);
        field2.set(stu,18);
        //输出结果
        System.out.println(stu);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值