首页 > 编程语言 >肖sir_Java 反射__20

肖sir_Java 反射__20

时间:2022-10-01 13:33:13浏览次数:48  
标签:__ sir 20 aClass 反射 Java 方法 class 类中

1.1 反射概述 Java中创建对象的方式 1、使用new关键字:这是我们最常见的也是最简单的创建对象的方式 2、使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去 3、使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象 4、反射   1.2 反射概述 什么是反射? Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。 反射是对一个类进行解剖,Java是面向对象的语言,一切皆对象,所以java认为编译后的class文件也是一种对象,Java把它也给抽象成了一种类,这个类就是Class。简单的说反射是对类的抽象   1.3 反射概述 反射的原理

 

 

1.4 反射概述 Java 反射机制主要功能,这些功能都位于java.lang.reflect包: 1,在运行时判断任意一个对象所属的类。 2,在运行时构造任意一个类的对象。 3,在运行时判断任意一个类所具有的成员变量和方法。 4,在运行时调用任意一个对象的方法。 5,生成动态代理     1.5 反射概述 Java 反射机制的优缺点: 优点: 1,能够运行时动态获取类的实例,大大提高系统的灵活性和扩展性。 2,与 Java 动态编译相结合,可以实现无比强大的功能。 3,对于 Java 这种先编译再运行的语言,能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。 缺点: 1,反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射; 2,反射调用方法时可以忽略权限检查,获取这个类的私有方法和属性,因此可能会破坏类的封装性而导致安全问题 2.1 反射相关类 Class类:代表类的实体,在运行的Java应用程序中表示类和接口 Field类:代表类的成员变量(成员变量也称为类的属性) Method类:代表类的方法 Constructor类:代表类的构造方法   2.2 反射相关类 Class类中的常用方法: 2.3 反射相关类 Field类中的常用方法:  2.4 反射相关类 Method类中的常用方法:

 

 

2.5 反射相关类 Constructor类中的常用方法: 

 

 

3.1 反射实例 Class对象创建方式: // 第一种方式,通过类全路径 Class<?> aClass = Class.forName("dcelesson1.test.Dog"); // 第二种方式,通过类名.class Class<?> bClass = Dog.class; // 第三种方式,通过类实例.getClass()方法 Dog dog = new Dog(); Class<?> cClass = dog.getClass(); 创建被反射类的对象 Object obj = aClass.newInstance();   3.2 反射实例 反射构造方法: // 获取无参构造方法 Constructor<?> constructor = aClass.getConstructor(null); // 获取一个参数的构造方法 Constructor<?> constructor1 = aClass.getConstructor(String.class); // 获取两个参数的构造方法 Constructor<?> constructor3 = aClass.getConstructor(String.class, int.class); // 获取私有的构造方法 Constructor<?> constructor4 = aClass.getDeclaredConstructor(String.class, int.class, String.class); constructor4.setAccessible(true); // 去掉java访问修饰符校验 // 获取所有构造方法,不包含私有的 Constructor<?>[] constructors = aClass.getConstructors(); // 通过构造方法创建对象 Object o = constructor.newInstance();   3.3 反射实例 反射类中的方法: Object obj = aClass.newInstance(); // 创建被反射类的对象 // 获取公有非静态方法 Method method1 = aClass.getMethod("dog1", String.class, int.class, String.class); // 获取私有非静态方法 Method method2 = aClass.getDeclaredMethod("dog3", String.class, int.class); method2.setAccessible(true); // 去掉java访问修饰符校验 // 获取静态公有方法 Method method3 = aClass.getMethod("dog2", String.class); // 获取所有方法,不包含私有方法,但包含继承和实现的方法 Method[] methods = aClass.getMethods(); // 获取所有方法,包含私有方法,不包含继承和实现的方法 Method[] methods1 = aClass.getDeclaredMethods(); // 执行obj对象中的dog1方法 Object invoke = method1.invoke(obj, “旺财”, 25, “雌性");   3.4 反射实例 反射类中的属性字段: Object o6 = aClass.newInstance(); // 创建被反射类的对象 // 获取类中的私有属性字段 Field name = aClass.getDeclaredField("name"); name.setAccessible(true); name.set(o6, "大黄"); // 为name设置值 // 获取类中的公有属性字段 Field age = aClass.getField("age"); age.set(o6, 30); // 为age设置值 age.get(o6); // 获取age的值 // 获取类中所有的属性字段,不包含私有的 Field[] fields = aClass.getFields(); // 获取类中所有的属性字段,包含私有的 Field[] fields1 = aClass.getDeclaredFields() 课后练习题: 1,把任意一个Java实体类对象中的所有属性转成Map 例如: Dog类中有属性:name,age name = "旺财" age = 23 转换成Map后 key = name,value = "旺财" key = age,value = 23 //方法格式 public Map<String,Object> convtClassToMap(Class class){ }  

标签:__,sir,20,aClass,反射,Java,方法,class,类中
From: https://www.cnblogs.com/xiaolehong/p/16747116.html

相关文章