当前位置: 首页 > 后端技术 > Java

Java中反射的概念、含义及用法(适合新手阅读)

时间:2023-04-01 19:39:16 Java

简介Java中JRE、JDK、javac.exe、java.exe的区别及Java运行机制中反射的概念Java的反射机制语言是在程序运行的时候,对于任何一个类,都可以知道这个类的所有属性和方法;当程序运行时,对于任何对象,你都可以调用它的任何属性和方法;动态获取信息,动态调用对象方法;含义)好处一般创建类对象并调用其属性和方法,不能直接传递给私有修饰成员。当使用反射调用其类中的属性和方法时,权限修饰符将被忽略。反射的含义(动态解释)假设此时用户需要三个类方法:学生类、教师类、工人类,都是标准的JavaBean类 //学生类publicclassStudent{privateString姓名;私人年龄;publicStudent(){}publicStudent(Stringname,intage){this.name=name;这个。年龄=年龄;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicvoidstudy(){System.out.println("学生正在学习");}@OverridepublicStringtoString(){return"Student{"+"name='"+name+'\''+",age="+age+'}';}}//teacherclasspublicclassTeacher{privateStringname;私人年龄;publicTeacher(){}publicTeacher(Stringname,intage){this.name=name;这个。年龄=年龄;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicvoidteach(){System.out.println("老师在上课");}@OverridepublicStringtoString(){return"Teacher{"+"name='"+name+'\''+",age="+age+'}';}}//工人类publicclassWorker{privateStringname;私人年龄;publicWorker(){}publicWorker(Stringname,intage){this.name=name;这个。年龄=年龄;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicvoidwork(){System.out.println("工人在工作");}@OverridepublicStringtoString(){返回“工作er{"+"name='"+name+'\''+",age="+age+'}';}}1.没有反思作为程序员,我们先写学生类,然后写main方法类,封装两个类供用户使用//使用学生类的main方法类publicclassTestReflect{publicstaticvoidmain(String[]args){//学生在学习之后}},我们添加了一个teacher方法,这个方法是交给用户的,用户需要接收新写的teacher方法和新写的main方法类。//使用main方法classpublicclassofthestudentandteacherclassesTestReflect{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.study();//学生正在学习Teachertea=newTeacher();tea.teach();//老师在课后}},我们添加了一个worker方法,交给了用户,用户需要接收新写的worker方法和新写的main方法类。//使用学生、教师、工人的main方法类publicclassTestReflect{publicstaticvoidmain(String[]args){Studentstu=newStudent();stu.study();//学生正在学习老师tea=newTeacher();tea.teach();//老师在上课Workerwor=newWorker();wor.work();//worker在工作}}总结:这里可以看到,每增加一个功能,都需要重写main方法,然后交给用户。代码中明确写明要创建的对象是Student、Teacher、Worker……,硬编码,不灵活。2.使用反射使用反射,我们添加一个properties配置文件,在这个文件中写入创建对象的类名。无论main方法读取哪个对象,都使用反射来创建字节码文件对象。读取的内容是创建的,因此它是动态的。文件结构展示:properties配置文件:className=myreflect1.WorkermethodName=workmain方法:(这里涉及反射的用法,可以先了解一下,学完用法再了解)importjava.io.IOException;importjava.io。输入流;导入java.lang.reflect.Constructor;导入java.lang.reflect.InvocationTargetException;导入java.lang.reflect.Method;导入java.util.Properties;公共类ReflectDemo1{publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException,NoSuchMethodException,IllegalAccessException,InvocationTargetException,InstantiationException{//获取系统类加载器,加载prop.properties文件InputStreamis=ClassLoader.getSystemClassLoader().getResourceAsStream("myreflect1\\props");//properties属性集合Propertiesprop=newProperties();//将文件中的数据读入集合prop.load(is);is.close();//------------下面的代码是使用反射创建对象并调用方法--------------------//获取字节码文件对象Classclazz=Class.forName(prop.getProperty("className"));//获取构造器对象构造函数constructor=clazz.getConstructor();//使用构造函数对象创建对象Objecto=constructor.newInstance();//获取方法对象Methodmethod=clazz.getMethod(prop.getProperty("methodName"));//运行方法method.invoke(o);//result:workersareworking}}总结:使用反射后,无论用户需要使用哪个对象,我们只需要将修改后的配置文件发送给用户即可,用户的main方法代码不需要修改并且具有很高的灵活性。3、重新认识反射机制:使用反射,可以忽略修饰符,获取类中的所有属性和方法。(重点看用法)首先获取配置文件中的信息,动态获取信息并创建对象和调用方法。关于反射的使用,网上有很多介绍。这里有一篇写的不错:Java反射机制与API使用