反射 柔光的暖阳◎ 2022-02-16 13:24 154阅读 0赞 > JAVA反射机制是在运行状态中 > > 对于任意一个类,都能够知道这个类的所有属性和方法; > > 对于任意一个对象,都能够调用它的任意一个方法和属性; > > 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 ### 1)获取Class对象的三种方式 ### //Object类中的getObject()方法 Person person = new Person(); Class c1 = person.getClass(); System.out.println(c1); //类名.class 获取到字节码文件对象 Class c2 = Person.class; System.out.println(c2); //通过Class类中的方法 Class c3 = Class.forName("cn.it.ref.Person"); System.out.println(c3); System.out.println(c1==c2);//T System.out.println(c1==c3);//T System.out.println(c3==c2);//T ### 2)通过反射获取构造方法并使用 ### @Test public void func1() throws Exception{ Class c1 = Class.forName("cn.it.ref.Person"); // 获取所有的public 修饰的构造方法 /*Constructor[] constructors = c1.getConstructors(); for (Constructor constructor : constructors) { System.out.println(constructor); }*/ //获取public修饰, 指定参数类型所对应的构造方法。 //不传参数得到无参构造方法 //获取指定的构造方法,空参数的构造方法 Constructor constructor = c1.getConstructor(); System.out.println(constructor);//public cn.it.ref.Person() //运行空参数构造方法,Constructor类方法 newInstance()运行获取到的构造方法 Object obj = constructor.newInstance(); System.out.println(obj);//Person [name=null, age=null] Constructor constructor2 = c1.getConstructor(String.class,Integer.class); System.out.println(constructor2);//public cn.it.ref.Person(java.lang.String,java.lang.Integer) Object obj1 = constructor2.newInstance("jackson",20); System.out.println(obj1);//Person [name=jackson, age=20] //前提: 类有空参的公共构造方法,构造方法权限必须public Object obj2 = c1.newInstance(); System.out.println(obj2);//Person [name=null, age=null] //反射获取私有的构造方法运行 Constructor declaredConstructor = c1.getDeclaredConstructor(Integer.class,String.class); //Constructor类,父类AccessibleObject,定义方法setAccessible(boolean b) declaredConstructor.setAccessible(true); Object newInstance = declaredConstructor.newInstance(21,"john"); System.out.println(newInstance);//Person [name=john, age=21] } ### 3)反射获取成员变量并改值 ### @Test public void func2() throws Exception{ Class c = Class.forName("cn.it.ref.Person"); Object obj = c.newInstance(); //获取成员变量 Class类的方法 getFields() class文件中的所有公共的成员变量 Field[] fields = c.getFields(); for (Field field : fields) { System.out.println(field);//public java.lang.String cn.it.ref.Person.name } //获取指定的成员变量 String name Field field = c.getField("name"); field.set(obj, "jackson"); System.out.println(obj);//Person [name=jackson, age=null] } ### 4)反射获取成员方法并运行 ### @Test public void func3() throws Exception{ Class c = Class.forName("cn.it.ref.Person"); Object obj = c.newInstance(); // Method[] getMethods()获取的是class文件中的所有公共成员方法,包括继承的 Method[] methods = c.getMethods(); for (Method method : methods) { System.out.println(method); } Method method = c.getMethod("method1"); //obj 指的是调这个方法的对象。 //args 指的是调用这个方法所要用到的参数列表。 //返回值Object就是方法的返回对象。如果方法没有返回值 ,返回的是null. method.invoke(obj);//method1 //返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法 Method method1 = c.getMethod("method1", String.class); method1.invoke(obj, "123456");//method1..123456 } ### 5)用反射的方法绕过编译,得到Class文件对象,直接调用add方法 ### 反射泛型擦除 java中的泛型是 伪泛型 伪泛型:在编译后的.class文件里面是没有泛型的。类型为Object @Test public void func4() throws Exception{ List<String> list = new ArrayList<String>(); list.add("jack"); //反射方式,获取出集合ArrayList类的class文件对象 Class c = list.getClass(); //获取ArrayList.class文件中的方法add Method method = c.getMethod("add", Object.class); method.invoke(list, "lucy"); method.invoke(list, 21); method.invoke(list, 22); System.out.println(list); } ### 6)**反射配置文件** ### **pro.properties:** #className=cn.it.ref.Worker #classMethod=work className=cn.it.ref.Student classMethod=student @Test public void func5() throws Exception{ //IO流读取配置文件 FileReader fr = new FileReader("src/pro.properties"); //创建集合对象 Properties properties = new Properties(); //调用集合方法load,传递流对象 properties.load(fr); //关闭流 fr.close(); //通过键获取值 String className = properties.getProperty("className"); String classMethod = properties.getProperty("classMethod"); //反射获取指定类的class文件对象 Class c = Class.forName(className); Object newInstance = c.newInstance(); //获取指定的方法名 Method method = c.getMethod(classMethod); method.invoke(newInstance); }
相关 Java反射-反射 API 转自:https://www.jianshu.com/p/e55770dd48d3 涉及这些类 ![watermark_type_ZmFuZ3poZW5naGVpdGk_s 深碍√TFBOYSˉ_/ 2023年01月17日 07:40/ 0 赞/ 196 阅读
相关 反射_反射概述 反射 JAVA反射机制是在运行状态中,对于任意一个 类,都能够知道这个类的所有属性和方法;对 于任意一个对象,都能够调用它的任意一个方 清疚/ 2022年06月17日 02:22/ 0 赞/ 247 阅读
相关 反射 知识点: 1. 类对象概念 2. Class类的使用:创建类对象 3. 动态加载类 4. 获取方法信息 5. 获取成员变量、构造函数信息 6. 方法反射的基本操作 比眉伴天荒/ 2022年04月14日 04:14/ 0 赞/ 202 阅读
相关 反射 // 1.定义一个标准的JavaBean,名叫Person,包含属性name、age。 // 使用反射的方式创建一个实例、调用构造函数初始化name、age,使用反射方式调 Dear 丶/ 2022年04月03日 08:16/ 0 赞/ 207 阅读
相关 反射 > JAVA反射机制是在运行状态中 > > 对于任意一个类,都能够知道这个类的所有属性和方法; > > 对于任意一个对象,都能够调用它的任意一个方法和属性; > > 这种 柔光的暖阳◎/ 2022年02月16日 13:24/ 0 赞/ 155 阅读
相关 反射 反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态 喜欢ヅ旅行/ 2022年01月25日 19:23/ 0 赞/ 108 阅读
相关 反射 反射 类加载器的概述 当程序要使用某个类时,如果该类还未被加载到内存中, 则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 加载 就是指将c 怼烎@/ 2022年01月17日 12:13/ 0 赞/ 232 阅读
相关 【反射】 JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法 比眉伴天荒/ 2021年11月09日 20:40/ 0 赞/ 492 阅读
相关 反射 反射机制简述 静态编译:在编译时确定类型,绑定对象,即通过。 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的 小咪咪/ 2021年09月27日 14:00/ 0 赞/ 376 阅读
相关 反射 RTTI -------------------- 运行时类型识别(RTTI, Run-Time Type Identification)是Java中的机制,在Jav 不念不忘少年蓝@/ 2021年09月23日 00:44/ 0 赞/ 309 阅读
还没有评论,来说两句吧...