Java Days11 反射

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package cn.itcast.demo1;

//学生类
public class Student {
}

package cn.itcast.demo1;

import cn.itcast.demo3.Student;

/*
    获取Class对象(字节码文件对象)的三种方式
        1. Object类的getClass(方法
            Class clazz =对象名.getClass();
        2.类的静态属性
            Class clazz =类名.class;
        3. Class类的静态方法
            Class clazz = Class.forName ("类的正名);       正名:包名+类名
        注意:
            一个源文件(. java文件)对应一个字节码文件对象(. class)

 */
public class ReflectDome2 {
    public static void main(String[] args) throws ClassNotFoundException {
        //需求:创建Class对象
        //方法一
        Student stu = new Student();
        Class clazz1 = stu.getClass();

        //方式二:
        Class clazz2 = Student.class;

        //方式三:
        Class clazz3 = Class.forName("cn.itcast.demo1.Student");
    }
}

在这里插入图片描述

package cn.itcast.demo2;

public class Student {
    //公共的无参构造
    public Student() {
    }

    //公共的带参构造
    public Student(String name) {

        System.out.println("您录入的name值是" + name);
    }

    //私有的带参构造
    private Student(int age) {

        System.out.println("您录入的age值是" + age);
    }
}

package cn.itcast.demo2;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

/*
    Class类
        成员方法:
            public Constructor getConstructor (Class... params):
                根据参数列表,获取对应的构造器对象(仅限公共构造函数)
            public Constructor getDeclaredConstructor (Class...params) ;
                根据参数列表,获取对应的构造器对象(包含私有构造函数)
            public Constructors getConstructors();                  获取此类所有的构造函数(不含私有)

        Constructor类: 构造器类
            概述:属于java. base模块下的java. lang. reflect包下的类
            成员方法:
                public String getName();                            获取构造函数名
                public T newInstances (Object...params);          根据此构造函数和指定参数创建对象

 */
public class ReflectDemo2 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //1. 获取字节码文件对象
        Class clazz = Class.forName("cn.itcast.demo2.Student");

        //2. 获取指定的构造器对象
        //2.1 获取公共的无参构造
        Constructor con1 = clazz.getConstructor();
        System.out.println(con1);
        //2.2 获取公共的有参构造
        Constructor con2 = clazz.getConstructor(String.class);
        System.out.println(con2);
        //获取构造器名字,看看是哪个类的构造
        System.out.println(con2.getName());
        //2.3 获取私有的有参构造
        Constructor con3 = clazz.getDeclaredConstructor(int.class);
        System.out.println(con3);
        //2.4 获取此类所有的构造函数(不含私有)
        Constructor[] con4 = clazz.getConstructors();
        //增强for循环遍历
        for (Constructor con : con4 ) {
            System.out.println(con);
        }
        System.out.println("----------------------------------");

        //3. 根据构造器对象的getInstance方法和参数 创建对象
        Student stu = (Student) con2.newInstance("张三");

        //4. 打印结果
        System.out.println(stu);
    }
}

在这里插入图片描述

package cn.itcast.demo3;

public class Student {
    //公共的空参方法
    public void show1() {
        System.out.println("公共的空参方法");
    }

    //公共的带参方法
    public void show2(int a) {
        System.out.println("公共的带参方法,传入的a的值是:" + a);
    }

    //私有的带参方法
    private int show3(int a, int b) {
        System.out.println("私有的带参方法");
        return a + b;
    }
}

package cn.itcast.demo3;

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

/*
    Class类
        成员方法:
            public Method getMethod(String name, Class- params)
                返回一个Method对象,仅公共成员方法

            public Method getDeclaredMethod (String, Class.. params)
                返回一个Method对象,可获取私有成员方法

            public Method[] getMethodsO)返回此类所有 (不含私有)方法的數组

    Method:方法类  用来表示所有的成员方法(对象)的.
        概述:属于java. base模块下的java. lang. reflect包下的类

        成员方法:
            public String getName 0);                                   获取成员方法名
            public object invoke (0bject obj; 0bject--. params)         调用指定方法
                                                                        obj表示该类的对象
                                                                        params表示调用该方法所需的参数
            public void setAccessible (boolean flase):                  是否开启暴力反射(true:开启)

 */
public class ReflectProject {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //需求:通过反射获取Student类中的成员方法并调用
        //1.创建Student字节码文件对象
        Class clazz = Class.forName("cn.itcast.demo3.Student");

        //2. 获取该类的构造器对象,然后创建student类的对象
        Constructor con = clazz.getConstructor();
        Student stu = (Student) con.newInstance();
        //System.out.println(stu);

        //3. 获取该类的成员方法对象,然后调用此方法
        //3.1 调用公共的空参方法
        Method method1 = clazz.getMethod("show1");
        //打印方法对象
        System.out.println(method1);
        //打印方法名
        System.out.println(method1.getName());
        //调用该方法
        method1.invoke(stu);
        System.out.println("________________________");

        //3.2 调用公共的带参方法
        Method method2 = clazz.getMethod("show2", int.class);
        //打印方法对象
        System.out.println(method2);
        //打印方法名
        System.out.println(method2.getName());
        //调用该方法
        method2.invoke(stu, 2);
        System.out.println("-------------------------");

        //3.3 调用私有的带参方法
        Method method3 = clazz.getDeclaredMethod("show3", int.class, int.class);
        //因为是私有方法,为了可以访问 要加一步srtAccessible为true
        method3.setAccessible(true);
        //调用方法
        int sum = (Integer) method3.invoke(stu, 2, 3);
        System.out.println(sum);

		//3.4 获取全部的成员方法
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }
    }
}

案例

package cn.itcast.demo4;

public class Student {
    public String name;

    public Student() {
    }

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

    public String getName() {
        return name;
    }

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

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

package cn.itcast.demo4;

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

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        //需求:通过反射获取类的setter方法,使用该方法为属性赋值
        //1. 通过反射获取Student类的字节码文件对象
        Class clazz = Class.forName("cn.itcast.demo4.Student");

        //2. 通过反射获取该类的构造器对象,然后创建student类的对象
        Constructor con = clazz.getConstructor();
        Student stu = (Student) con.newInstance();

        //3. 获取指定的setName()方法,给Student对象设置值
        Method setName = clazz.getMethod("setName", String.class);
        setName.invoke(stu,"张三");
        //4. 打印学生对象
        System.out.println(stu);
    }
}

在这里插入图片描述

package cn.itcast.demo5;

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

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

package cn.itcast.demo5;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/*
    Class类
        成员方法:
            public Field getField(String name)                      返回一个Field对象,仅公共成员变量
            public Field getField(String name)                      返回一个Field对象,可获取私有成员变量
            public Field[] getDeclaredFields()                       返回此类所有 (含私有)成员变量的数组

    Field: 属性类用来表示所有的域(属性,成员变量)对象的.
        概述:属于java. base模抉下的java. lang. reflect包下的类
        成员方法:
            public void setAccessible (boolean flag);               是否开启暴力反射(true:开启)
            public void set (0b.ject obj, 0bject value) ,          设置obj对象的指定属性值为value

 */
public class ReflectDemo1 {
    public static void main(String[] args) throws Exception {
        //需求:反射方式获取成员变量并使用
        //1. 通过反射获取指定类的字节码文件对象
        Class clazz = Class.forName("cn.itcast.demo5.Student");

        //2. 通过反射获取构造器对象,创建Student对象
        Constructor con = clazz.getConstructor();
        Student stu = (Student)con.newInstance();
        //Student stu = (Student)clazz.getConstructor().newInstance();   链式编程

        //3. 通过反射获取指定的对象
        Field field1 = clazz.getField("name");
        Field field2 = clazz.getDeclaredField("age");
        field2.setAccessible(true);
        field1.set(stu,"张三");
        field2.set(stu,20);

        //4. 打印结果
        System.out.println(stu);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值