JAVA反射

1、JAVA的反射机制是在运行状态中

2、在运行时判断一个对象所属的类调用任意一个对象的方法

在运行时构造任意一个类的对象,判断任意一个类所有的成员变量和方法。

(要想解剖一个类,必须先要获取到该类的字节码文件对象(class)。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.)

3、Person.java

package com.example.reflecdemo;

public class Person {

    private String name;
    private String age;

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

    public Person() {
        super();
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

}

4、使用反射操作属性

  private void field()
            throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchFieldException {

        //第一种方法
        //Class class1 = Person.class;

        //第二种方法
        Class class1 = new Person().getClass();

        //第三种方法 使用反射操作属性(变量)
        //Class class1 = Class.forName("reflect.Person");

        //得到所有的属性
        //class1.getDeclaredFields();

        // 得到对象
        Person p = (Person) class1.newInstance();

        // 得到指定的属性
        Field f = class1.getDeclaredField("name");

        // 设置方法允许操作私有属性
        f.setAccessible(true);

        // 赋值
        f.set(p, "zhangsan");

        // 获取值(Person中设置属性为私有,需要设置一个方法setAccessible(true))
        Log.d(TAG, "===>" + f.get(p));
    }

5、使用反射操作构造器

private static void constructor() throws ClassNotFoundException, NoSuchMethodException, InstantiationException,
            IllegalAccessException, InvocationTargetException {
        //Class class2 = Class.forName("reflect.Person");
        Class class2 = Person.class;

        // 得到所有的构造方法
        // class2.getConstructor();

        // 得到指定的构造方法
        Constructor c = class2.getConstructor(String.class, String.class);

        // 得到对象
        Person p = (Person) c.newInstance("lisi", "100");

        Log.d(TAG, "name===>" + p.getName() + ",age===>" + p.getAge());

    }

6、使用反射操作方法

private static void method() throws ClassNotFoundException, InstantiationException, IllegalAccessException,
            NoSuchMethodException, InvocationTargetException {
        //Class class3 = Class.forName("reflect.Person");
        Class class3 = Person.class;

        // 得到对象
        Person p = (Person) class3.newInstance();

        //获取所有普通方法
        class3.getDeclaredMethods();

        //获取指定参数普通方法
        Method m = class3.getDeclaredMethod("setName", String.class);

        m.invoke(p, "wangmazi");

        Log.d(TAG, "name===>" + p.getName());
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值