学习思维导图:
1.什么是反射
反射java语言中的一种机制,通过这种机制可以动态的实例化对象、读写属性、调用方法
2.类类
①Class.forName(完整类名)
第一种写法:
第二种写法:
②类名.Class
通用查询
③对象.getClass()
通用增删改
3.反射实例化
①getConstructor
只能获取到公用的构造器
报错:没有匹配的方法
②getDeclaredConstyuctor
可以获取到私有的构造器以及公用的构造器
报错:没有访问权限
正确写法:
③newInstance
反射调用有参构造器:
括号里填的是你将要调的构造方法里面的参数的类型
4.反射动态方法的调用
①getMethod
②getDeclaredMethod
invoke 参数1:类实例,在这里指的是Student类实例
参数2:当前被调用的方法,传递的参数值
Invoke的返回值,就是被反射调用的方法的返回值,如果被调用的方法是void,那么返回null
报错:方法未找到
正确写法:
完整代码:
public class Demo3 {
public static void main(String[] args) throws Exception {
Class<Student> stuClz1=(Class<Student>)Class.forName("com.zhuwei.reflect.Student");
Student s=stuClz1.newInstance();
Method m1 = stuClz1.getMethod("hello");
System.out.println(m1.invoke(s));
Method m2 = stuClz1.getDeclaredMethod("hello",String.class);
System.out.println(m2.invoke(s,"张三"));
Method m3 = stuClz1.getDeclaredMethod("add",Integer.class,Integer.class);
m3.setAccessible(true);
System.out.println(m3.invoke(s,10,5));
}
}
5.反射读写属性
①getDeclaredFiled
报错:
正确写法:
public class Demo4 {
public static void main(String[] args) throws Exception {
Class<?> stuClz1 = Class.forName("com.zhuwei.reflect.Student");
Student s=(Student) stuClz1.newInstance();
Field f = stuClz1.getDeclaredField("sname");
f.setAccessible(true);
f.set(s, "张三");
System.out.println(s.getSname());
System.out.println(f.get(s));
}
}
反射写属性:
反射读属性:
②getDeclaredFileds
比较oop与反射读取属性值的方式
反射获取该对象所有属性值