谈谈对java反射的理解
1. java反射机制的概念
java反射机制是在运行状态中,对于任意一个实体类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制.
2.反射的功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)
- 在运行时调用任意一个对象的方法
- 生成动态代理
3.反射的基本运用(常用的API)
反射相关的类一般都在java.lang.reflect包中
(1)获得class对象(三种方式)
- 使用class类的forName静态方法
例如:Class.forName(driver); - 直接获取某一个对象的class
例如:Class<?> classz = int.class;
Class<?> classInt = Integer.TYPE; - 调用某个对象的getClass()方法
例如:StringBuilder str = new StringBuilder(“123”);
Class<?> klass = str.getClass();
(2)判断是否为某个类的实例
一般使用isInstance关键字来判断是否为某个类的实例,同时也可以借助反射中的Class对象的isInstance()方法来判断是否为某个类的实例,它是一个native方法.
(3)创建实例(两种方式)
使用Class对象额newInstance()方法来创建Class对象对应的实例
Class<?> c = String.class;
Object str = c.newInstance();先通过Class对象获取指定的Constructor对象,再调用Constructor对象的newInstance()方法来创建实例.
//获取string所对应的Class对象
Class<?> c = String.class;
//获取String类带一个String参数的构造器
Constructor constructor = c.getConreuctor(String.class);
//根据构造器创建实例
Object obj = contructor.newInstance(“2222”);
(4)获取方法
- getDeclaredMethods() ——返回类或接口声明的所有方法,包括公共,保护,默认(包)访问和私有方法,但是不包括继承的方法.
- getMethods()——返回某个类的所有公用方法,包括其继承类的公用方法. 它还可以获取父类的方法
- getMethod() ——- 返回一个特定的方法
(5)获取构造器信息
(6)获取类的成员变量(字段)信息
- getFiled() ———访问共有的成员变量
- getDeclaredField() ——- 所有已声明的成员变量,但不能得到父类的成员变量
(7)调用方法—invoke()方法
(8)利用反射创建数组
4.反射的优缺点
优点
反射提高了程序的灵活性,降低耦合性,提高自适应能力,它允许程序创建和控制任何类的对象,无需提前硬编码目标类.
缺点
性能问题,反射会消耗一定的系统资源,若不需要动态创建对象,那就不需要反射,反射调用方法时可以忽略权限检查,因此可能破坏封装性而导致的安全问题
5.反射的使用场景
JDBC,动态代理,工厂模式,SSM框架,dubbo框架,其他的框架,获取第三方类(没有源码),封装框架等
还没有评论,来说两句吧...