Android 反射笔记

该代码示例展示了如何使用Java的反射API来操作类的构造器、方法和属性字段。首先,它获取`Person`类的所有构造器并创建实例。接着,通过反射调用公共方法和私有方法,以及设置和获取私有属性的值。
import android.app.Activity;

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

public class ReflectTest {
    public static void main(String[] args){
        try {

            Class<Person> activityClass = (Class<Person>) Class.forName("com.example.myapplication.Person");
            System.out.println("---------------------构造器相关 Start ------------------");
            Constructor<Person>[] constructors = (Constructor<Person>[]) activityClass.getConstructors();
            System.out.println("------------- class.getConstructors()获取所有构造器-----------------");
            for (Constructor c : constructors) {
                System.out.println(c);
            }
            Person person = activityClass.newInstance();
            person.setAge(18);
            System.out.println("通过class创建对象  class.newInstance() age : " +person.getAge());

            System.out.println("获取指定构造器   class.getDeclaredConstructor  ---------");
            Constructor constructor = activityClass.getDeclaredConstructor(int.class,String.class);
            Person person1 = (Person) constructor.newInstance(19,"xiaoming");
            System.out.println("通过构造器创建对象  constructor.newInstance     age : " +person1.getAge());
            System.out.println("---------------------构造器相关 End------------------");

            Method[] methods = activityClass.getMethods();
            System.out.println("------------- class.getMethods() 获取所有方法 ,包括父类方法但是不包括私有方法-----------------");
            for (Method method : methods){
                System.out.println(method.getName());
            }

            Method method1 = activityClass.getMethod("setName",String.class);
            System.out.println("—————————————获取指定方法并打印  class.getMethod   method.getName() : " + method1.getName());
            method1.invoke(person,"zhangsan");
            System.out.println("----------------利用invoke方法调用对象方法赋值 method.invoke       name : " + person.getName());

            Method[] methodss = activityClass.getDeclaredMethods();
            System.out.println("------------打印所有方法 包括私有共有方法  class.getDeclaredMethods ------------");
            for(Method method: methodss){
                System.out.println(""+method.getName());
            }
            System.out.println("------------执行私有方法 method.setAccessible  method.invoke ------------");
            Method privateMethod = activityClass.getDeclaredMethod("privateMethod");
            privateMethod.setAccessible(true);
            privateMethod.invoke(person);

            System.out.println("------------获取所有属性字段,包括私有属性 class.getDeclaredFields------");
            Field[] fields = activityClass.getDeclaredFields();
            for (Field f: fields){
                System.out.println(" " + f.getName());
            }
            Field field = activityClass.getDeclaredField("name");
            field.setAccessible(true);
            field.set(person,"xiaosan");
            System.out.println("----------设置指定对象的值  field.set     name : " + person.getName());
            Field field1 = activityClass.getDeclaredField("age");
            field1.setAccessible(true);
            System.out.println("----------获取私有属性的值 field.setAccessible    field.get     age " + field1.get(person));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值