反射的一些基本操作

一、反射的获取功能

1.获取成员变量们

Field[] getFields():获取所有public修饰的成员变量

Field getField(String name):获取指定名称的public修饰的成员变量

Field[] getDeclaredFields():获取所有的成员变量,不考虑修饰符

Field getDeclaredField(String name)

2.获取构造方法们

Constructor<?>[] getConstructors()

Constructor<?> getConstructor(类<?>...parameterTypes)

Constructor<?>[] getDeclaredConstructors()

Constructor<?> getDeclaredConstructor(类<?>...parameterTypes)

3.获取成员方法们

Method[] getMethods()

Method getMethod(String name,类<?>...parameterTypes)

Method[] getDeclaredMethods()

Method getDeclaredMethod(String name,类<?>...parameterTypes)

4.获取类名

String getName()

二、使用方式

1.Constructor

创建对象:

        *T newInstance(objext... initargs)

        *如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

2.Method

*执行方法:

        *object invoke(Object obj,Object... args)

*获取方法名称:

        *String getName:获取方法名

3.Field

*操作

        1.设置值

                *set(Object obj,Object value)

        2.获取值

                *get(Object obj)

注意:

爆破:忽略访问权限修饰符的安全检查

        *setAccessible(true):暴力反射,可以修改private修饰的变量

简单演示:

public class Person {//存放在Subject包中
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void eat(){
        System.out.println("eating...");
    }
    public void eat(String food){
        System.out.println("eating "+food+" ...");
    }
    public void run(){
        System.out.println("running...");
    }
}

public class ReflectTest {
    public static void main(String[] args) throws Exception {
        //1
//        Class person = forName("cn.Subject.Person");
//        Field[] fields = person.getDeclaredFields();
//        Person person1 = new Person("张三",24);
//        for(Field field : fields) {
//            field.setAccessible(true);//爆破
//            Object obj = field.get(person1);
//            System.out.println(obj);
//        }


        //2
//        Class person = Person.class;
        Method method = person.getMethod("eat");
//        Method method = person.getMethod("eat",String.class);
//        Person person1 = new Person();
//        method.invoke(person1,"rice");

        //3
//        Person person1 = new Person();
//        Class person = person1.getClass();
//        Constructor constructor = person.getConstructor();
//        Object obj = constructor.newInstance();
//        System.out.println(obj);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值