首先,何谓反射,为什么要用反射?
Class.forName()这里简单概述一下反射的一些方法:那么你先要知道Class类,你可以理解为他是管理所有类的一个类:这也就是为什么Class.forName("类全路径") 可以得到类对象了;那么我们为什么要得到类对象呢?,因为他可以找到对应类并且加载;
我们来说一说何谓加载:当你java源文件通过编译器得到.class文件时,类加载器可以通过加载将其加载到内存当中,并将其中的静态数据放在方法区中(变为运行中的数据结构)然后产生Class对象;
与new的对比:其实到这里还是没有理解为何要反射:因为可以用new对吧,但是new的话,耦合会比较高(其实我也没明白为什么new耦合就高了),那么反射就是在程序在执行的时候获取其他类信息,简而言之就和spring的Autowired差不多,注入就完了;
那么反射到底作用是啥呢?在Java运行环境中,对于任意一个类可以知道这个类的属性以及方法,对于任意一个对象可以调用任意一个方法,动态的获取类的信息以及动态的调用方法——反射机制
那么问题来了,是?描述的
Class类,我们通过反射为的就是从Class类中获取其他类信息
package com.huang.reflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class test05 { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException { Class aClass = Class.forName("com.huang.reflection.User"); User user = (User) aClass.newInstance(); System.out.println(user); System.out.println("------------------"); //含参构造 Constructor declaredConstructor = aClass.getDeclaredConstructor(String.class); User user2 = (User) declaredConstructor.newInstance("Fairy");//利用newInstance()给含参构造器赋值 System.out.println(user2); System.out.println("-------------------"); //通过反射调用普通方法 User user3 = (User) aClass.newInstance();//其实可以理解为:通过类对象获取无参构造器 //通过反射获取一个方法(setName()) Method setName = aClass.getDeclaredMethod("setName", String.class); //将反射中的方法参数赋值(“激活”) setName.invoke(user3,"Fairy同学"); //激活后getName()即可 System.out.println(user3.getName()); System.out.println("--------------------"); //通过反射对属性进行操作 User user4 = (User) aClass.newInstance();//首先得到类对象的无参构造 //然后获取属性(类对象对类中内容具有一切执行操作权) Field name = aClass.getDeclaredField("name"); //因为name是private,所以需要更改权限 name.setAccessible(true); //对属性赋值操作 name.set(user4,"Fairy同学2"); System.out.println(user4.getName()); } }
newIntance:通过Class对象调用,得到对应类中的无参构造;
当然有参构造也是可以的:1.首先得到Class对象,2.通过Class对象调用得到含参的构造器
3.然后构造器调用newInstance(),给构造器赋值;
Invoke:一般是用于给反射方法参数赋值的 :方法名.invoke(对象,参数值);
通过类对象调用getDeclaredMethod("方法名",String.class(类型而已)) 得到反射方法;
setAccessible:变量属性为private时,需要修改权限
//通过反射对属性进行操作 User user4 = (User) aClass.newInstance();//首先得到类对象的无参构造 //然后获取属性(类对象对类中内容具有一切执行操作权) Field name = aClass.getDeclaredField("name"); //因为name是private,所以需要更改权限 name.setAccessible(true); //对属性赋值操作 name.set(user4,"Fairy同学2"); System.out.println(user4.getName());



