肖sir_Java 反射__20

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){
}
 
posted @ 2022-10-01 13:20  xiaolehua  阅读(17)  评论(0编辑  收藏  举报