反射
来源:互联网 发布:网络flash插件未安装 编辑:程序博客网 时间:2024/06/05 08:01
刚开始学习反射的时候觉得用这个东西挺麻烦的,而且也没什么实用价值。但学到后面的知识,比如设计模式,框架发现用这个都比较多。而且可以用性很高,所以现在只好又大量找资料学习一边
反射机制是什么
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
反射原理
- 首先把java文件保存到本地硬盘.java
- 编译java文件生成.class文件
- 使用jvm,把class文件通过类加载加载到内存中去
- 万事万物都是对象,class文件在内存中通过Class类表示
当使用反射时就需要获取Class类, 得到这个类就可以得到里面所有的东西(这里画个图大概说明下后面详讲)
具体功能实现
反射机制获取类有三种方法,我们来获取Employee类型
创建对象:获取类以后我们来创建它的对象,利用newInstance
使用反射来操作类中的属性
Class c2 = Class.forName("reflect.Student"); //得到Student实例类 Student stu = (Student) c2.newInstance(); //得到类中的属性,参数是属性的名称 Field f = c2.getDeclaredField("name"); //设置可以操作私有属性 f.setAccessible(true); //设置name属性的值 f.set(stu, "张晓慧"); //打印 System.out.println(f.get(stu));
4.使用反射参构造方法进行操作
//得到Class Class c1 = Class.forName("reflect.Student");//操作无参构造方法 //得到Student实例类 Student stu = (Student) c1.newInstance(); //设置值 stu.setName("张三"); //打印 System.out.println(stu.getName());//操作有参构造方法 //得到有参的构造方法 Constructor cc = c2.getConstructor(String.class,String.class); //通过有参的构造方法进行类的实例化 Student stu = (Student) cc.newInstance("11","李四"); //打印 System.out.println(stu.getId()+":"+stu.getName());
5.使用反射来操作普通方法
//得到Class Class c2 = Class.forName("reflect.Student"); //实例化得到的类 Student stu = (Student) c2.newInstance(); //得到类中需要操作的普通方法 Method me = c2.getDeclaredMethod("setName",String.class); //让setName方法执行,执行设置值 me.invoke(stu, "张晓慧"); //打印 System.out.println(stu.getName());
反射加配置文件,使我们的程序更加灵活
在设计模式学习当中,学习抽象工厂的时候就用到了反射来更加方便的读取数据库链接字符串等,当时不是太理解,就照着抄了。看一下.NET中的反射+配置文件的使用:
当时用的配置文件是app.config文件,内容是XML格式的,里边填写链接数据库的内容:
这样的好处是很容易的方便我们变换数据库,例如我们将系统的数据库从SQL
Server升级到Oracle,那么我们写两份D层,在配置文件的内容改一下,或者加条件选择一下即可,带来了很大的方便。当然了,JAVA中其实也是一样,只不过这里的配置文件为.properties,称作属性文件。通过反射读取里边的内容。这样代码是固定的,但是配置文件的内容我们可以改,这样使我们的代码灵活了很多!
综上为,JAVA反射的再次学习,灵活的运用它,能够使我们的代码更加灵活,但是它也有它的缺点,就是运用它会使我们的软件的性能降低,复杂度增加,所以还要我们慎重的使用它