Java反射(一)

每天都要学习,坚持就是胜利

本篇博客对反射进行简单介绍,用反射进行获取对象的成员变量和函数,并进行操作,这些是后续操作的基础


一、获取类的方法、构造方法、属性

  1. 获取Class对象

    • 方式一:Class<?> class1 =Class.forName("com.guo.test.Person");
    • 方式二:Class<?> class1=Person.class;
    • 方式三:Person person=new Person(); Class<?> class1=person.getClass();
  2. 获取Class对象的属性

    Field[] allFields = class1.getDeclaredFields();//获取class对象的所有属性
    Field[] publicFields = class1.getFields();//获取class对象的public属性
    Field ageField = class1.getDeclaredField("age");//获取class指定属性
    Field desField = class1.getField("des");//获取class指定的public属性
  3. 获取class对象的方法

    Method[] methods = class1.getDeclaredMethods();//获取class对象的所有声明方法
    Method[] allMethods = class1.getMethods();//获取class对象的所有public方法 包括父类的方法
    Method method = class1.getMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的public方法
    Method declaredMethod = class1.getDeclaredMethod("info", String.class);//返回次Class对象对应类的、带指定形参列表的方法
  4. 获取class对象的构造函数

    Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//获取class对象的所有声明构造函数
    Constructor<?>[] publicConstructors = class1.getConstructors();//获取class对象public构造函数
    Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//获取指定声明构造函数
    Constructor publicConstructor = class1.getConstructor(String.class);//获取指定声明的public构造函数
  5. 其他方法

    Annotation[] annotations = (Annotation[]) class1.getAnnotations();//获取class对象的所有注解
    Annotation annotation = (Annotation) class1.getAnnotation(Deprecated.class);//获取class对象指定注解
    Type genericSuperclass = class1.getGenericSuperclass();//获取class对象的直接超类的 Type
    Type[] interfaceTypes = class1.getGenericInterfaces();//获取class对象的所有接口的type

二、操作对象

  1. 调用构造方法生成实例

    //第一种方式 Class对象调用newInstance()方法生成
    Object obj = class1.newInstance();
    //第二种方式 对象获得对应的Constructor对象,再通过该Constructor对象的newInstance()方法生成
    Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//获取指定声明构造函数
    obj = constructor.newInstance("hello");
  2. 调用类的方法

    // 生成新的对象:用newInstance()方法
    Object obj = class1.newInstance();
    //首先需要获得与该方法对应的Method对象
    Method method = class1.getDeclaredMethod("setAge", int.class);
    //调用指定的函数并传递参数
    method.invoke(obj, 28);

    当通过Method的invoke()方法来调用对应的方法时,Java会要求程序必须有调用该方法的权限。如果程序确实需要调用某个对象的private方法,则可以先调用Method对象的如下方法。
    setAccessible(boolean flag):将Method对象的acessible设置为指定的布尔值。值为true,指示该Method在使用时应该取消Java语言的访问权限检查;值为false,则知识该Method在使用时要实施Java语言的访问权限检查。

  3. 调用类的方法

    //生成新的对象:用newInstance()方法 
    Object obj = class1.newInstance();
    //获取age成员变量
    Field field = class1.getField("age");
    //将obj对象的age的值设置为10
    field.setInt(obj, 10);
    //获取obj对象的age的值
    field.getInt(obj);
    • 通过Class对象的getFields()方法或者getField()方法获得指定方法,返回Field数组或对象。

    • Field提供了两组方法来读取或设置成员变量的值:

    • getXXX(Object obj):获取obj对象的该成员变量的值。此处的XXX对应8种基本类型。如果该成员变量的类型是引用类型,则取消get后面的XXX。

    • setXXX(Object obj,XXX val):将obj对象的该成员变量设置成val值。


先介绍这些,后续再详细介绍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值