一、java反射原理:
1、把java文件保存到本地硬盘:.java。
2、编辑java文件,生成.class文件。
3、使用jvm,把class文件通过 类加载器 加载到内存中。
4、万事万物皆对象,class文件在内存中使用Class类来表示。
5、使用反射时,获取到Class类,就获取了里面的所有内容,包括:
1)属性:Filed类。
2)构造器:Constructor类。
3)普通方法:Method类。
二、通过反射获取Class类的方法:
1、通过类名.class获取:Class cla = SysUser.class;
2、通过对象.getClass()方法获取:Class cla = new SysUser().getClass();
3、通过Class.forName("类的全路径")获取: Class cla = Class.forName("com.cosy.module.sys.module.SysUser");
三、通过反射操作类的构造方法:
1、操作无参构造:SysUser sysUser = cla.newInstance();
2、操作有参构造:SysUser sysUser = cla.newInstance("姓名", "年龄"); 【有参构造方法内参数是什么,这里就写什么】。
四、通过反射操作类的属性:
1、获取Class对象:Class cla = SysUser.class;
2、获取name属性:Filed filed = clas.getDeclaredField("name");
3、获取SysUser实例对象:SysUser sysUser = cla.newInstance();
4、给name属性赋值:
【如果name属性是私有属性,需要设置权限:field.setAccessible(true);】
field.set(sysUser, "名字"); 【该步相当于:sysUser.setName("名字")】
五、通过反射操作类的普通方法【Spring AOP 底层原理中设计到用此来 调用目标对象方法】:
1、方法的权限是public :
1).获取“introduceYourself”方法,参数是String类型
Method method = claz.getDeclaredMethod("introduceYourself", String.class);
2).调用方法:
method.invoke(claz.newInstance(), "赵大")
2、方法的权限是private :
1).获取“introduceYourself”方法,参数是String类型
Method method = claz.getDeclaredMethod("introduceYourself", String.class);
2).调用方法:
method.setAccessible(true);
method.invoke(claz.newInstance(), "赵大")
3、方法是静态方法,即用static修饰:
1).获取“introduceYourself”方法,参数是String类型
Method method = claz.getDeclaredMethod("introduceYourself", String.class);
2).调用方法:【静态方法不需要实例对象】
method.invoke(null, "赵大")