什么是反射呢?
反射是java语言中的一种机制,通过这种机制可以动态的实例化对象,读写属性,调用方法
这是获取Class类的三种方式示例代码图
package com.zking.jee07.reflect;
public class Test {
public static void main(String[] args) throws Exception {
//获取大写Class的三种方式
//1.Class.forName() 得到Student的模板
Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
//2.Student.class
Class<Student> stuClazz01 =Student.class;
//3.对象.getClass()
Student stu =new Student();
Class<Student> stuClazz02 =(Class<Student>)stu.getClass();
}
}
这是反射实例化的代码示例代码图
package com.zking.jee07.reflect;
import java.lang.reflect.Constructor;
public class Test02 {
public static void main(String[] args) throws Exception {
//1.直接new对象
Student stu =new Student();
//2.反射
Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
/*Constructor<Student> c1 =stuClazz.getConstructor();
Student stu02 =c1.newInstance();*/
//无参构造函数的简便方法
Student stu02 =stuClazz.newInstance();
stu02.setSid("01");
stu02.setSname("zs");
System.out.println("stu02 =" + stu02.getSname());
//获取有参的构造函数
Constructor<Student> stuCon =stuClazz.getConstructor(String.class);
Student stu03 =stuCon.newInstance("白萝卜豆腐汤");
System.out.println("stu03 =" + stu03.getSid());
Constructor<Student> stuCon01 =stuClazz.getConstructor(String.class,String.class);
Student stu04 =stuCon01.newInstance("04","海带玉米汤");
System.out.println("stu04 ="+ stu04.getSname());
//调用私有的构造函数
Constructor<Student> stuCon02 =stuClazz.getDeclaredConstructor(Integer.class);
//打开私有方法的访问权限 Accessible
stuCon02.setAccessible(true);
Student stu05 =stuCon02.newInstance(23);
System.out.println("stu05 ="+ stu05.age);
}
}
这是反射动态方法调用示例代码图
package com.zking.jee07.reflect;
import java.lang.reflect.Method;
public class Test03 {
public static void main(String[] args) throws Exception {
//1.传统方式
Student stu =new Student();
stu.setSname("白萝卜豆腐汤");
//2.反射
Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
Student stu02 =stuClazz.newInstance();
stu02.setSid("01");
stu02.setSname("zs");
//通过反射获取Method
Method method =stuClazz.getMethod("hello");
Object obj =method.invoke(stu02);
System.out.println(obj);
//有参
Method m02 =stuClazz.getMethod("hello", String.class);
m02.invoke(stu02, "花花世界迷人眼");
//有返回值的情况,且是私有方法
//IllegalAccessException 无权访问异常
Method m03 =stuClazz.getDeclaredMethod("add", Integer.class,Integer.class);
//打开访问权限
m03.setAccessible(true);
int sum =(int)m03.invoke(stu02, 3,3);
System.out.println(sum);
}
}
这是反射读写属性代码示例图
package com.zking.jee07.reflect;
import java.lang.reflect.Field;
public class Test04 {
public static void main(String[] args) throws Exception {
Class<Student> stuClazz =(Class<Student>)Class.forName("com.zking.jee07.reflect.Student");
Student stu02 =stuClazz.newInstance();
stu02.setSid("01");
stu02.setSname("zs");
stu02.setAge(20);
//动态的获取属性的值
Field f =stuClazz.getField("age");
int age =(int)f.get(stu02);
System.out.println(age);
//获取私有的属性 NoSuchFieldException 没有这样一个列的异常
Field f2 =stuClazz.getDeclaredField("sname");
//打开属性
f2.setAccessible(true);
String name =(String)f2.get(stu02);
System.out.println(name);
//设置值
f2.set(stu02, "花花世界迷人眼");
System.out.println("~~~~~~~~~~"+stu02.getSname());
Field[] f3 =stuClazz.getDeclaredFields();
for(Field f4:f3) {
//打开权限
f4.setAccessible(true);
System.out.println(f4.getName()+":"+f4.get(stu02));
}
}
}