反射
- 为什么要学反射
- 什么是反射
- 获取类对象
- 反射的三大作用
- 用反射可能会出现的错误
为什么要学反射
反射是框架的核心,可以提高开发效率,是框架的基石(让代码更加有灵活性)
什么是反射
反射是java语言中的一种机制,通过这种机制可以动态的实例化对象,调用方法,读写属性(能够将未知的对象进行实例化)
获取类对象
1.Class.forName(完整类名)
2.类名.classs
3.对象.getClass
Class<?> c1 = Class.forName("com.lishengnan.reflect.Student");
System.out.println(c1);
System.out.println("___________________________________________________________");
Class c2=Student.class;
System.out.println(c2);
System.out.println("____________________________________________________________");
Student stu=new Student();
Class c3=stu.getClass();
System.out.println(c3);
呈现的结果
反射的三大作用
1.实例化对象
公有的实例化 x.newInstance()
Constructor<? extends Student> c= c1.getConstructor(String.class);
Student stu3 = c.newInstance("s002");
System.out.println(stu3);
私有的实例化
Constructor<? extends Student> c3= c1.getDeclaredConstructor(Integer.class);
c3.setAccessible(true);
Student stu5=c3.newInstance(20);
System.out.println(stu5);
呈现的结果
oop与反射实例化的区别
oop实例化对象,处理的是业务逻辑的
反射实例化对象,就算没有实体类,也同样可以new对象
//oop实例化
Student stu1=new Student();
Class c1=stu1.getClass();
System.out.println("------------------------------");
//反射实例化
Object stu2 = (Student)c1.newInstance();
System.out.println(stu2);
呈现的结果
2.动态调用方法
Method m;
m.invoke
动态被调用得方法,如果是void类型返回值,那么invoke结果为null,
如果不是void类型返回值,那么invoke结果就是被调用方法的结果
Student stu1=new Student();
Class c1=stu1.getClass();
动态被调用得方法,如果是void类型返回值,那么invoke结果为null
Method m = c1.getMethod("hello");
Object invoke = m.invoke(stu1);
System.out.println(invoke);
System.out.println("-----------------------------------------");
如果不是void类型返回值,那么invoke结果就是被调用方法的结果
Method m3 = c1.getDeclaredMethod("add", Integer.class,Integer.class);
m3.setAccessible(true);
Object invoke3 = m3.invoke(stu1, 20,8);
System.out.println(invoke3);
呈现的结果
3.读写属性
Student stu1=new Student("s001","可乐");
Class c1=stu1.getClass();
Field f = c1.getDeclaredField("sname");
f.setAccessible(true);
System.out.println(f.get(stu1));
呈现的结果
用反射可能出现的错误
NoSuchMethodException 没有此构造方法
IllegalAccessException 非法访问
注:x.getConstructor 获取到公开的构造方法
x.getDeclaredConstructor 可以获取到任何修饰符的构造方法