您好,登录后才能下订单哦!
本篇内容主要讲解“如何理解反射调用成员”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解反射调用成员”吧!
类结构中的最后一个核心的组成就是成员(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方法的调用。
到此,相信大家对“如何理解反射调用成员”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。