温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解反射调用成员

发布时间:2021-10-14 10:47:26 来源:亿速云 阅读:107 作者:iii 栏目:编程语言

本篇内容主要讲解“如何理解反射调用成员”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解反射调用成员”吧!

反射调用成员

类结构中的最后一个核心的组成就是成员(Field),大部分情况下都会将其称为成员属性,对于成员信息的获取也是通过Class类完成,在这个类中提供了如下两组操作方法:
获取本类全部成员:
public Field[] getDeclaredFields() throws SecurityException
获取本类指定成员:
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException
获取父类全部成员:public Field[] getFields() throws SecurityException
获取父类指定成员:public Field getField(String name) throws NoSuchFieldException, SecurityException

范例:修改要操作的父类:
AbstractBase:

public abstract class AbstractBase {protected static final String BASE = "www.mldn.cn";private String info = "HELLO MLDN";public AbstractBase() {}public AbstractBase(String msg) {}
}

IChannelService:

public interface IChannelService {
    public static final String NAME = "mldnjava";
    public boolean connect();
}

范例:获取类中的成员

import java.lang.reflect.Field;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        {    // 获取父类之中公共成员信息 Field fields [] = cls.getFields();  //获取成员 for (Field fie : fields) {
                System.out.println(fie);
             }
        }
        System.out.println("---------番茄酱与辣椒酱的分割线-------------");
        {  //获取子类中定义的成员Field fields [] = cls.getDeclaredFields();for (Field fie : fields){
                System.out.println(fie);
            }
        }
    }
}

执行结果:
如何理解反射调用成员

但是在Field类中最为重要的操作形式并不是获取全部成员,而是如下三个方法:
设置属性内容:
public void set(Object obj, Object value) throws IllegalArgumentException, IllegalAccessException
获取属性内容:
public Object get(Object obj) throws IllegalArgumentException, IllegalAccessException
解除封装:
public void setAccessible(boolean flag)
所有成员是在对象实例化后进行空间分配的,所以此时一定要先有实例化对象后才可以进行成员的操作。

范例:直接调用Person类中的name私有成员

import java.lang.reflect.Field;public class JavaAPIDemo {public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        Object obj = cls.getConstructor().newInstance();  //实例化对象(分配成员空间)Field nameField = cls.getDeclaredField("name");  //获取成员对象nameField.setAccessible(true);  //对私有属性必须先解除封装,nameField.set(obj,"番茄强");  //等价于:Person对象.name = "番茄强"System.out.println(nameField.get(obj));
    }
}

通过一系列的分析可以发现,类中的构造、方法、成员属性都可以通过反射实现调用,但是对于成员的反射很少这样直接处理,大部分操作都应该setter和getter处理,所以对于以上的代码只能够说是反射的特色,但是不具备实际的使用能力,而对于Field类在实际开发中只有一个方法最为常用:
获取成员类型:
public Class<?> getType()
范例:获取Person类中name成员的类型

import java.lang.reflect.Field;
public class JavaAPIDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls = Class.forName("cn.mldn.vo.Person");
        Field nameField = cls.getDeclaredField("name");System.out.println(nameField.getType().getName());  //获取完整的名称,包.类 java.lang.StringSystem.out.println(nameField.getType().getSimpleName());  // 获取类名称 String}
}

在以后开发中进行反射处理的时候,往往会利用Field类和Method类实现类中的setter方法的调用。

到此,相信大家对“如何理解反射调用成员”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI