反射
获取Class对象: .class即可。
场景1:
User 和Admin的权限不同。传来的只是一个string来区分二者。
要创建不同的bean。
就需反射创建对象。
-
使用getName()获取到路径。可用于classpath ,传入Class.forName()
-
getFields():获得类(包括父类)的public成员变量 getDeclaredFields():获得类(不包括父类)的全部成员变量
-
getMethods():获取类(包括父类)中的public方法(不包括构造方法)
-
getDeclaredMethods():获取本类(不包括父类)中的所有方法(不包括构造方法)
-
getConstructors():获取本类(不包括父类)中的所有public构造方法
获取对象 (获取需求类的class对象(forName,getClass,.class),从而获取构造器,再newInstance即可)
Class<?> clazz=Class.forName("com.xiaohao.test.User");
User user=(User) clazz.newInstance(); //1 方法一
User user=User.class.newInstance(); //2 方法二
User user2=new User();
User user=user2.getClass().newInstance();//3 方法三
拿到Class的途径:forName通过类路径获取
c1=Class.forName("test.A1");//通过forName()获取A1的Class对象
A1 a1=(A1)c1.newInstance();//使用这种实例化方式,则A1中必须有无参构造方法
拿到了class对象,就可以调用其getConstructors获取所有构造方法。
利用构造方法的newInstance即可
Constructor<?>[] con=c1.getConstructors();//类中存在多个构造方法时,数组顺序和类中写构造方法的顺序一致
A1 a2=(A1)con[0].newInstance();//A1中也必须存在无参构造方法
反射调用类的方法(同样获取目标类,getMethod获取到方法以及参数,invoke(该类的对象)即可)
c=Class.forName("test.A");//通过forName()获取A的Class对象
A a=(A)c.newInstance();
Method m1=c.getMethod("sayHello");//获得无参数的syaHello方法
m1.invoke(a);
Method m2=c.getMethod("sayHello", String.class);//获得只含有String类型参数的sayHello方法
m2.invoke(a, "everyOne");