我爱编程

java的反射机制

2018-06-21  本文已影响0人  twenty_one

最近在学习spring框架的原理,其中运用到了大量的反射机制(反射是框架设计的灵魂),下面就介绍下关于反射机制的使用。

一、获取Class对象(三种方式,其中第三种最为常用)

1、Object.getClass()方法;

2、通过任何数据类型(包括基本数据类型)都含有的静态属性class;

3、通过Class的静态方法forName(String className),className为带包名的路径,即包名.类名;

二、通过反射机制获取构造方法并使用

主要方法:

1、public Constructors[] getConstructors(),获取所有公有的构造方法;

2、public Constructors[] getDeclaredConstructors(),获取所有的构造方法(包括public、protected、default、private);

3、public Constructor getConstructor(Class<?>... parameterTypes),获取某个公有的构造方法;

4、public Constructor getDeclaredConstructor(Class parameterType),获取某个构造方法,可能是公有、保护、默认、私有;

5、调用构造方法,使用constructor的public Object newInstance(Object...initargs);

6、通过constructor的setAccessibale(true)来解除私有限定,从而访问私有的构造方法;

三、通过反射机制获取字段并使用

1、getFields(),获取所有公有字段;

2、getDeclaredFields(),获取所有的字段,包括公有、私有、保护、默认;

3、getField(String fieldName),获取某个公有字段;

4、getDeclaredField(String fieldName),获取某个字段,包括公有、私有、保护、默认;

5、通过field的public void set(Object obj,Object value)方法设置字段值,其中obj为要设置字段值所在对象,value为所要设置的字段值;

5、通过field的setAccessible(ture)方法,解除私有限定,从而访问私有字段;

四、通过反射机制获取方法并调用

1、getMethods(),获取所有的公有方法;

2、getDecalaredMethods(),获取所有方法,包括公有、私有、默认、保护;

3、getMethod(String methodName,Class<?>... parameterType),获取某个公有方法;

4、getDecalaredMethod(String methodName,Class<?>... parameterTypes),获取某个方法,包括公有、私有、保护、默认;

5、通过method的public Object invoke(Object obj,Object... params)调用某个方法,其中obj为需要调用方法所在对象,params为调用方法是所传入的参数;

6、通过method的setAccessible(true),解除私有限定,从而调用私有方法;

7、通过反射机制调用main方法:

①、Method mainMethod = clazz.getMethod("main",String[].class);

②、mainMethod.invoke(clazz.getConstructor().newInstance(),new String[]{});

五、通过反射越过泛型检查

1、问题描述:向有一个String泛型的集合中添加一个Integer类型的值

2、List<String> list = new ArrayList<String>();

3、Class clazz = list.getClass();

4、Method addMethod = clazz.getMethod("add",Object.class);

5、addMethod.invoke(list,100);

PS:此篇文章参考了CSDN一博主关于java反射机制的博客,进行了精简提炼;附上传送门Java基础之—反射(非常重要) - CSDN博客

上一篇下一篇

猜你喜欢

热点阅读