java的反射机制
最近在学习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博客