day18 暴力反射

一、本类用于测试暴力反射物料类

package cn.tedu.reflection;

public class Person {
    //1.提供私有属性
    private String name;
    private int age;

    //2.提供私有方法
    private void save(int a ,String s){
        System.out.println("正在保存ing...");
    }
    private void update(){
        System.out.println("正在更新ing...");
    }

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

二、本类用于测试暴力反射

 

package cn.tedu.reflection;

import org.junit.Test;

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

/**本类用于测试暴力反射*/
public class TestReflect2 {
    /**单元测试方法*/
    /**1.通过单元测试方法1:暴力反射获取和设置私有属性*/
    @Test
    public void getFields() throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InstantiationException {
        //1.获取字节码对象
        Class<?> clazz = Class.forName("cn.tedu.reflection.Person");

        //2.获取私有属性
        Field field = clazz.getDeclaredField("name");
        //3.根据获取到的属性对象获取属性的类型
        System.out.println(field.getType().getName());
        //4.设置属性的值
        //4.1没有对象就要通过反射的方式创建对象
        Object obj = clazz.newInstance();
        //4.2暴力反射!!!!需要设置私有可见
        field.setAccessible(true);
        //4.3通过字段对象给来给刚刚创建的对象obj设置name属性值为"派大星"
        //set(m,n)--m:要给哪个对象设置值,n:是要设置的具体的值
        field.set(obj,"派大星");
        //4.4通过字段对象获取刚刚给obj对象设置的私有属性的值
        System.out.println(field.get(obj));
        //Constructor<?> con = clazz.getConstructor();

    }
    /**2.通过单元测试方法2:暴力反射获取和设置私有方法*/
    @Test
    public void getFunction() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        //1.获取Class字节码对象
        Class<?> clazz= Person.class;
        //2.通过暴力反射获取私有方法
        /**getDeclaredMethod(m,x,y,z...)
         * m:要获取的方法名
         * x,y,z...可变参数,是这个方法的参数类型,但注意要加,class
         * */
        Method method = clazz.getDeclaredMethod("save", int.class, String.class);
        //3.1没有对象就通过反射的方式创建对象
        Object obj = clazz.newInstance();
        //3.2想要执行私有方法,也需要先设置私有可见
        method.setAccessible(true);
        //invoke(),表示通过反射技术执行方法
        /**invoke(o,x,y,z...)表示通过反射技术执行方法
         * o:要执行的是哪个对象的方法
         * x,y,z....:执行这个方法{method对象代表的之前获取到的save()}时需要传入的参数*/
        //3.3通过反射技术invoke(),执行目标对象obj的目标方法method{save()}
        //save()被调用是传入的参数是100,"海绵宝宝"
        method.invoke(obj,100,"海绵宝宝");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值