一、什么是反射呢?
反射java语句中的一种机制,通过这种机制可以动态的实例对象、读写属性、调用方法。
二、类类
1、Class.forName(完整类名)
//1.Class.forName(),得到Student模板
Class<Student> stuClazz = (Class<Student>)Class.forName("com.zking.reflect.Student");
2、类名.Class
//2.Student.Class
Class<Student> stuClazz01 = Student.class;
3、对象.getClass()
//3. 对象.getClass()
Student stu = new Student();
Class<Student> stuClazz02 = (Class<Student>)stu.getClass();
三、反射实例化
1、getConstructor
Constructor<Student> stuCon = stuClazz.getConstructor(String.class);
Student stu03 = stuCon.newInstance("li");
System.out.println("stu03 = " + stu03.getSid());
2、getDeclaredConstructor
3、newInstance
//调用私有的构造函数
Constructor<Student> stuCon05 = stuClazz.getDeclaredConstructor(Integer.class);
//打开私有方法的访问权限
stuCon05.setAccessible(true);
Student stu05 = stuCon05.newInstance(23);
System.out.println("stu05 = " + stu05.age);
四、反射动态方法调用
1、getMethod
通过反射来获取Method:
//通过反射来获取Method
Method method = stuClazz.getMethod("hello");
Object obj = method.invoke(stu02);
System.out.println(obj);
2、getDeclaredMethod
有返回值得情况,且是私有方法:
Method m03 = stuClazz.getDeclaredMethod("add", Integer.class,Integer.class);
m03.setAccessible(true);//打开访问权限
int sum = (int)m03.invoke(stu02, 3 ,3);
System.out.println(sum);
五、反射读写属性
动态的获取属性的值:
Field f = stuClazz.getField("age");
int age = (int)f.get(stu02);
System.out.println(age);
1、getDeclaredField
获取私有的属性:
//获取私有的属性
Field f02 = stuClazz.getDeclaredField("sname");
f02.setAccessible(true);
String name = (String)f02.get(stu02);
System.out.println(name);
2、getDeclaredFields
Field[] fs = stuClazz.getDeclaredFields();
for(Field f04 : fs) {
f04.setAccessible(true);
System.out.println(f04.getName()+": "+f04.get(stu02));
}