Java反射

本文介绍了Java中的反射机制,通过三种方式获取Class对象:Class.forName(),类名.class,对象.getClass()。接着展示了如何利用反射获取构造方法,包括公共构造器和私有构造器,并创建对象。此外,还讨论了获取成员变量和成员方法的方法,以及如何通过反射修改成员变量的值。
摘要由CSDN通过智能技术生成

反射

类在反射面前是赤裸裸的,被看的一清二楚。

1,简介

在这里插入图片描述

2,获取class对象的三种方式

//JavaBean类——Student
//Idea 创建JavaBean快捷键 Alt+insert(构造方法,get和set方法……等)
package com.hanfei.pojo;

public class Student {
    private String name;
    public Student (){

    }

    public String getName() {
        return name;
    }

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

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


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

package com.hanfei.Reflex;

import com.hanfei.pojo.Student;

public class testreflex {
    public static void main(String[] args) throws ClassNotFoundException {
        /**
         * 获取class对象的三种方式
         * 1,Class.forName("全类名");
         * 2,类名。class
         * 3,对象。getClass();
         */
        //第一种方式
        //最常用的
        Class aClass = Class.forName("com.hanfei.pojo.Student");

        //第二种方式
        //一般是当做参数传递
        Class clazz2 = Student.class;
        //第三种
        //只有当有类的对象时才能使用
        Student s = new Student();
        Class clazz3 = s.getClass();
        System.out.println(aClass == clazz2);
        System.out.println(clazz2==clazz3);


    }
}

执行结果:都为true说明获得的都是该类的字节码文件

在这里插入图片描述

3,利用反射获取构造方法

在这里插入图片描述

代码实现:

//javabean-Student2类
package com.hanfei.pojo;

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

    public Student2(int age) {
        this.age = age;
    }

    public Student2(String name, int age) {
        this.name = name;
        this.age = age;
    }
    private Student2(String name){
        this.name = name;
    }
    //测试获取构造方法用例
//    protected Student2(String name) {
//        this.name = name;
//    }

    private Student2(){

    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

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

package com.hanfei.Reflex;

import java.lang.reflect.Constructor;
import java.util.Iterator;

public class testtwo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
        //获取Class对象
        Class<?> st1 = Class.forName("com.hanfei.pojo.Student2");
        //获取所有公共构造方法对象的数组
        System.out.println("===========");
        Constructor<?>[] constructors = st1.getConstructors();
        for(Constructor con:constructors){
            System.out.println(con);
        }
        System.out.println("===========");
        //获取所有构造方法对象的数组
        Constructor<?>[] constructors2 = st1.getDeclaredConstructors();
        for(Constructor con:constructors2){
            System.out.println(con);
        }
        System.out.println("===========");
        //获取单个公共构造方法对象
        Constructor constructors3 = st1.getConstructor(String.class,int.class);

            System.out.println(constructors3);
        System.out.println("===========");

        //获取单个构造方法对象
        Constructor constructors4 = st1.getDeclaredConstructor(String.class);

        System.out.println(constructors4);



    }
}

执行结果:
在这里插入图片描述

代码实现:

package com.hanfei.Reflex;

import com.hanfei.pojo.Student2;

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

public class testtwo_1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<?> st1 = Class.forName("com.hanfei.pojo.Student2");
        Constructor constructors4 = st1.getDeclaredConstructor(String.class);
        //获取访问修饰符
        int mod = constructors4.getModifiers();
        System.out.println(mod);
        //结果为2
        //创建对象
        constructors4.setAccessible(true);//忽略权限限制,不设置private修饰的构造方法无法创建对象,但满足权限限制的构造方法可以用
        Student2 st2 = (Student2)constructors4.newInstance("张三");
        System.out.println(st2);
        //获取形参和名字大家可以去看jdk
        
    }
}

执行结果:

在这里插入图片描述

4,利用反射获取成员变量(字段值)

在这里插入图片描述

代码实现:

ckage com.hanfei.Reflex;

import com.hanfei.pojo.Student2;

import java.lang.reflect.Field;

public class Test02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Class<?> aClass = Class.forName("com.hanfei.pojo.Student2");
        //获取所有的公共成员变量,Student2没有公共类
        Field[] fields = aClass.getFields();
        for(Field fi:fields){
            System.out.println(fi);
        }
        //获取所有的成员变量
        Field[] declaredFields = aClass.getDeclaredFields();
        for(Field fi :declaredFields){
            System.out.println(fi);
        }
        //获得单个成员变量
        Field declaredField = aClass.getDeclaredField("name");
        System.out.println(declaredField);

        //获取修饰符
        declaredField.getModifiers();
        //获取名字
        System.out.println(declaredField.getName());
        //赋值
        Student2 st = new Student2("han",19);
        declaredField.setAccessible(true);
        declaredField.set(st,"hhhh");
        System.out.println(st.getName());
    }
}

5,利用反射获取成员方法

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值