Java安全:Java反射机制

Java反射

什么是反射?
反射允许对成员变量,成员方法和构造方法的信息进行编程访问,利用反射我们可以获取到类里面的所有信息

在这里插入图片描述

获取class对象的三种方式

● Class.forName(“全类名”);
● 类名.class
● 对象.getClass();


```java
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {

        // 第一种方式
        Class clazz = Class.forName("Student");

        System.out.println(clazz);

        // 第二种方式
        Class studentClass = Student.class;

        System.out.println(studentClass);

        System.out.println(clazz == studentClass);

        // 第三种方式
        Student S = new Student();

        Class aClass = S.getClass();

        System.out.println(aClass);
    }
}
获取构造方法

在这里插入图片描述

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

    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;
    }

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

    public Student() {
    }

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

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

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

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

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class student = Class.forName("Student");

        // 获取构造方法
        Constructor[] constructors = student.getConstructors();

        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }

        //
        Constructor[] declaredConstructors = student.getDeclaredConstructors();
        for (Constructor declaredConstructor : declaredConstructors) {
            System.out.println(declaredConstructor);
        }

        Constructor declaredConstructor = student.getDeclaredConstructor();
        System.out.println(declaredConstructor);

        Constructor declaredConstructor1 = student.getDeclaredConstructor(String.class);
        System.out.println(declaredConstructor1);

        Constructor declaredConstructor2 = student.getDeclaredConstructor(int.class);
        System.out.println(declaredConstructor2);

        Constructor declaredConstructor3 = student.getDeclaredConstructor(String.class, int.class);
        System.out.println(declaredConstructor3);

        int modifiers = declaredConstructor3.getModifiers();
        System.out.println(modifiers);

        Parameter[] parameters = declaredConstructor3.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        // 临时取消权限校验
        declaredConstructor3.setAccessible(true);
        Student ssp = (Student) declaredConstructor3.newInstance("ssp", 22);
        System.out.println(ssp);
    }
}

获取成员变量

在这里插入图片描述

import java.lang.reflect.Field;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        Class<?> student = Class.forName("Student");
        Field[] fields = student.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

        Field[] declaredFields = student.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }

        // 获取单个成员变量
        Field gender = student.getField("gender");
        System.out.println(gender);

        // 获取成员变量名
        String name = gender.getName();
        System.out.println(name);

        // 获取成员修饰符
        int modifiers = gender.getModifiers();
        System.out.println(modifiers);

        // 获取成员变量数据类型
        Class<?> type = gender.getType();
        System.out.println(type);

        // 获取成员变量记录的值
        Student ssp = new Student("ssp", 23, "男");
        Object o = gender.get(ssp);
        System.out.println(o);

        // 修改对象里面记录的值
        gender.set(ssp, "女");
        System.out.println(ssp);
    }
}

获取成员方法

在这里插入图片描述

package reflect4;

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

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class<?> aClass = Class.forName("reflect4.Student");
        Method[] methods = aClass.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

        // 获取指定单一方法
        Method sleep = aClass.getMethod("sleep");
        System.out.println(sleep);

        Method eat = aClass.getDeclaredMethod("eat", String.class);
        System.out.println(eat);

        // 获取方法的修饰符
        int modifiers = eat.getModifiers();
        System.out.println(modifiers);

        // 获取方法的名字
        String name = eat.getName();
        System.out.println(name);

        // 获取方法的形参
        Parameter[] parameters = eat.getParameters();
        for (Parameter parameter : parameters) {
            System.out.println(parameter);
        }

        // 获取方法抛出的异常
        Class<?>[] exceptionTypes = eat.getExceptionTypes();
        for (Class<?> exceptionType : exceptionTypes) {
            System.out.println(exceptionType);
        }

        /*
         * 方法运行
         * Method类中用于创建对象的方法
         * 参数1 用obj调用该方法
         * 参数2 调用方法传递的参数
         * 返回值 方法的返回值
         * */
        Student student = new Student();
        eat.setAccessible(true);
        String res = (String) eat.invoke(student, "汉堡包");
        System.out.println(res);

        Method eat1 = aClass.getDeclaredMethod("eat", String.class);
        eat1.setAccessible(true);
        Student student1 = new Student();
        String res1 = (String) eat1.invoke(student1, "牛肉");
        System.out.println(res1);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值