什么是反射
反射是一种机制,利用反射机制动态的实例化对象、读写属性、调用方法、构造函数。
也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。
反射能干什么用
-
获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等
-
获取任意对象的属性,并且能改变对象的属性
-
调用任意对象的方法
-
判断任意一个对象所属的类
-
实例化任意一个类的对象
-
通过反射我们可以实现动态装配,降低代码的耦合度,动态代理等。
如何使用反射?
一切与反射相关的代码都从获取类对应的字节码对象开始。
-
调用某个类的对象的getClass()方法,即:对象.getClass();
Student stu=new Student();
Class clazz=stu.getClass();
-
调用类的class属性类获取该类对应的Class对象,即:类名.class
Class clazz=Student.class;
-
使用Class类中的forName()静态方法,即:Class.forName(“类的全路径”)
Class clazz=Class.forName("com.zking.entity.Student");
传统实例化与反射实例化的区别
传统实例化
Student stu=new Student();
反射实例化
Class clazz=Class.forName("com.zking.entity.Student");
Object newInstance = cla.newInstance();
注:1)Class.forName指定全路径名必须正确,否则将报ClassNotFoundException错误;
2)在运行期间,一个类,类对象只能创建一个
反射的应用
类名 | 用途 |
---|---|
Class类 | 代表类的实体,在运行的Java应用程序中表示类和接口 |
Field类 | 代表类的成员变量(成员变量也成为类的属性) |
Method类 | 代表类的方法 |
Constructor类 | 代表类的构造函数 |
获取与Field类相关
类名 | 用途 |
getField(String name) | 获取某个公共的属性对象 |
getFields() | 获取所有公共的属性对象 |
getDeclaredField(String name) | 获取某个属性对象(public和非public) |
getDeclaredFields() | 获取所有属性对象(public和非public) |
setAccessible(boolean flag) | 默认值false,设置true使私有成员允许访问 |
set(Object,Object) | 属性赋值 |
get(Object) | 获取属性 |
代码应用
//反射实例化
Class<?> studentClass = Class.forName("com.zking.j2ee07.entity.Student");
Object stu = studentClass.newInstance();
//4.读写属性(field)
//1)获取单个的公共属性
Field field = studentClass.getField("age");
//2)获取公共的,私有的,受保护的,最终的,静态的等等的单个属性
Field field = studentClass.getDeclaredField("age");
//3)获取所有的公共属性
Field[] fields = studentClass.getFields();
//4)获取所有公共的,私有的,受保护的,最终的,静态的等等的属性
Field[] fields = studentClass.getDeclaredFields();
for (Field field : fields) {
System.out.println("属性名称"+field.getName());
System.out.println("属性类型"+field.getType());
System.out.println("访问修饰符"+field.getModifiers());
System.out.println("----------------------");
}
//5)属性赋值
Field field = studentClass.getField("age");
Field field = studentClass.getDeclaredField("sname");
//设置权限
field.setAccessible(true);
//set方法:1)实例化对象名 2)赋的值
field.set(stu,"zking");
//6)获取属性
//get方法参数:实例化对象名
Object age = field.get(stu);
System.out.println(age);
注:博主这里的代码注释都打开了,在运用时记得写一个板块注释一个
获取与Method相关
类名 | 用途 |
getMethod(String name, Class<>… parameterTypes) | 获取该类某个公共的方法 |
getMethods() | 获取该类所有公共的方法 |
getDeclaredMethods(String name,Class<>… parameterTypes) | 获取该类某个方法(public和非public) |
getDeclaredMethod() | 获取该类所有方法(public和非public) |
setAccessible(boolean flag) | 默认值false,设置true使私有方法允许访问 |
invoke(Object obj, Object… args) | 执行方法 |
代码应用
//获取类对象
Class clazz = Class.forName("com.zking.ssm.model.Student");
//反射机制实例化对象
Student student = (Student) clazz.newInstance();
//获取有参方法
Method method=cla.getDeClaredMethod("hello", String.class);
//设置访问权限
method.setAccessible(true);
//执行方法(无返回值)
//method.invoke(student,"张三");
//执行方法(有返回值)
Object obj=method.invoke(student, "张三");
获取Constructor类相关
类名 | 用途 |
---|---|
getConstructor(Class<>… parameterTypes) | 获取该类中与参数类型匹配的公有构造方法 |
getConstructors() | 获取该类的所有公共构造方法 |
getDeclaredConstructors(Class<>… parameterTypes) | 获取该类中与参数类型匹配的构造方法 |
getDeclaredConstructors() | 获取该类所有构造方法(public和非public) |
代码应用
//反射实例化
Class<?> studentClass = Class.forName("com.zking.j2ee07.entity.Student");
Object stu = studentClass.newInstance();
//6.构造方法(Constructor)
//1)获取该类中与参数类型匹配的公有构造方法
Constructor<?> constructor = studentClass.getConstructor(String.class);
//2)获取该类中与参数类型匹配的构造方法
Constructor<?> constructor = studentClass.getDeclaredConstructor(String.class);
//3)获取该类的所有公共构造方法
Constructor<?>[] constructor = studentClass.getConstructors();
//4)获取该类所有构造方法(public和非public)
Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
for (Constructor<?> constructor1 : declaredConstructors) {
System.out.println(constructor1.getName());
System.out.println(constructor1.getModifiers());
System.out.println(constructor1.getParameterCount());
}
//5)调用方法
Constructor<?> constructor = studentClass.getConstructor(String.class);
Constructor<?> declaredConstructor = studentClass.getDeclaredConstructor(String.class);
System.out.println(declaredConstructor);
Object instance = declaredConstructor.newInstance("zking");
System.out.println(instance);
今天的分享就到此结束啦!关注博主,持续更新!