前言:最近一直在学习,什么是java反射,今天就好好的聊一聊,到底什么是java反射???
一:什么是反射
谈到java反射,我们不妨先去运用一下我们之前的知识,什么是反射。大家可能见到最多的就是镜子了,人照镜子,通过镜子的反射看到自己。或者某个我们看不到的位置,通过把镜子伸进去,通过镜子的反射,看到对应的物品。
我理解,反射就是一面镜子,让我们可以看到我们不应该看到的。
二:java反射概念
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
java反射允许,在运行中操作,类所具有成员变量和方法。(通过反射private修饰的属性、方法、都可以调用)
也就是说,java反射允许我们,在程序运行的时候,可以通过反射拿到类的所有资源。
三:java反射的具体使用
3.1:访问构造函数
import java.lang.reflect.Constructor; //用来演示构造函数的使用 public class CreateObject { public void useConstructor() { try { //获取Student的字节流对象 Class studentClass = Class.forName("Student"); System.out.println("开始调用Student无参构造函数"); //---------------构造函数的访问------------------ //创建对象,无参构造函数 Object obj = studentClass.newInstance(); //转化成我们要使用的对象 Student student2 = (Student) obj; student2.study(); System.out.println("结束调用Student无参构造函数"); System.out.println("开始调用Student公有带参构造函数"); //反射的getConstructor方法的使用,公有带参构造函数 Constructor<?> constructor = studentClass.getConstructor(int.class, String.class); Object obj2 = constructor.newInstance(12, "23"); Student stu2 = (Student) obj2; stu2.study(); System.out.println("结束调用Student公有带参构造函数"); System.out.println("开始调用Student私有带参构造函数"); //getDeclaredConstructor方法的使用,私有带参构造函数 Constructor<?> constructor2 = studentClass.getDeclaredConstructor(int.class); //设置私有构造函数可访问 constructor2.setAccessible(true); Object obj3 = constructor2.newInstance(12); Student stu3 = (Student) obj3; stu3.study(); System.out.println("结束调用Student私有带参构造函数"); } catch (Exception e) { System.out.println(e); } } }
3.2 访问方法
import java.lang.reflect.Field; import java.lang.reflect.Method; //用来演示方法的使用 public class UseMethod { public void useMethod(){ try { //获取Student的字节流对象 Class<Student> stuClass = (Class<Student>) Class.forName("Student"); //公有方法,且不传参 Student student = stuClass.newInstance(); Method study = stuClass.getMethod("study"); //调用公有学习方法 System.out.println("调用了公有的study方法"); study.invoke(student); //私有方法 Student student2 = stuClass.newInstance(); Method sayHi = stuClass.getDeclaredMethod("sayHi",String.class); sayHi.setAccessible(true); System.out.println("调用了私有的sayHi方法"); //通过invoke调用sayHi sayHi.invoke(student2, "Tony"); } catch (Exception e) { System.out.println(e); } } }
3.3:访问属性
import java.lang.reflect.Constructor; import java.lang.reflect.Field; //用来演示属性的使用 public class UseAttribute { public void useAttribute() { try { //获取Student的字节流对象 Class<Student> stuClass = (Class<Student>) Class.forName("Student"); //公有属性 Student student = stuClass.newInstance(); Field score = stuClass.getField("score"); score.set(student, 12); //私有属性 Student student2 = stuClass.newInstance(); Field age = stuClass.getDeclaredField("age"); age.setAccessible(true); age.set(student2, 12); //获取所有属性 for (Field field : stuClass.getFields()) { System.out.println(field); } System.out.println("---分割线---"); for (Field declaredField : stuClass.getDeclaredFields()) { System.out.println(declaredField); } } catch (Exception e) { System.out.println(e); } } }
3.4:客户端
public class Client { //程序入口 public static void main(String[] args) { //调用三种类型的构造函数 CreateObject createObject1 = new CreateObject(); createObject1.useConstructor(); //调用两种不同类型的方法 UseMethod useMethod1 = new UseMethod(); useMethod1.useMethod(); //调用两种不同的属性 UseAttribute useAttribute1 = new UseAttribute(); useAttribute1.useAttribute(); } }