博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java反射机制
阅读量:4148 次
发布时间:2019-05-25

本文共 4462 字,大约阅读时间需要 14 分钟。

1. 什么是反射

它是java语言的一种内置的机制,通过这个机制可以动态的创建对象、读写属性、调用方法。简单的来说,反射机制指的是程序在运行时能够获取自身的信息,在Java中,只要给定类的名字,那么就可以通过反射的机制来获得类的所有信息。

2.哪里用到反射机制

有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,以前学jdbc时用过一行代码: Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成驱动对象实例,并不知道它的具体含义。现在很多开 框架都用到反射机制,hibernate、struts都是用反射机制实现的。

3.Java反射的优点和缺

为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念, 

  1. 静态编译:在编译时确定类型,绑定对象,即通过。 
  2. 动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。 

一句话,反射机制的优点就是可以实现动态创建对象和编译,体现出很大的灵活性,特别是在J2EE的开发中,它的灵活性就表现的十分明显。比如,一个大型的软件,不可能一次就把把它设计的很完美,当这个程序编 译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能 的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。 

它的缺点是对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它 满足我们的要求。这操作总是慢于只直接执行相同的操作。 

首先创建一个类

public class Student {// static{// System.out.println("work...");// }private String sid;private String sname;public Integer age;public static final int TYPE=10;public Student() {super();System.out.println("调用无参构造方法创建了一个学生对象");}public Student(String sid) {super();this.sid = sid;System.out.println("调用带一个参数的构造方法创建了一个学生对象");}public Student(String sid, String sname) {super();this.sid = sid;this.sname = sname;System.out.println("调用带二个参数的构造方法创建了一个学生对象");}@SuppressWarnings("unused")private Student(Integer age) {System.out.println("调用Student类私有的构造方法创建一个学生对象");this.age = age;}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public void hello() {System.out.println("你好!我是" + this.sname);}public void hello(String name) {System.out.println(name + "你好!我是" + this.sname);}@Overridepublic String toString() {return "Student [age=" + age + ", sid=" + sid + ", sname=" + sname+ "]";}@SuppressWarnings("unused")private Integer add(Integer a, Integer b) {return new Integer(a.intValue() + b.intValue());}}

4.如何获得类对象

  • 一切反射相关的代码,都是从获得类对象开始
  • 如何获得类对象: Class.forName(完整类名)
  • 类对象的作用:模子
  • 同一类的类对象只加载一次

5. 创建对象

  1. 公共无参构造方法(回顾Serlvet,Filter配置完整类名)
  2. 公共有参构造方法
  3. 私有无参构造方法
  4. 遍历所有的构造方法
/** * 创建对象 * @author king * */public class Demo2 {public static void main(String[] args) throws Exception {//Class c1=Class.forName("test.Employee");Class c1=Class.forName("test.Student");//传统的方式创建对象//Student s=new Student();//反射方式动态创建对象//公共的、无参数的 构造方法Object obj=c1.newInstance();System.out.println(obj);//公共的、有参数的 构造方法(getConstructor是指可见的)Constructor constructor=c1.getConstructor(String.class);Student s1=(Student)constructor.newInstance("安生");System.out.println(s1);//公共的、两个参数的 构造方法Constructor constructor2=c1.getConstructor(new Class[]{String.class,String.class});Student s2=(Student)constructor2.newInstance("s001","安生");System.out.println(s2);//私有的、带一个参数的 构造方法(getDeclaredConstructor是指只要是定义了的)Constructor constructor3=c1.getDeclaredConstructor(Integer.class);constructor3.setAccessible(true);//关闭访问权限Student s3=(Student)constructor3.newInstance(19);System.out.println(s3);System.out.println("ok");//遍历所有的方法(getDeclared得到所有定义了的)for (Constructor cs : c1.getDeclaredConstructors()) {System.out.println(cs);}}}

 

6. 属性的读写

  1. 反射机制读写公共属性
  2. 反射机制读写私有属性
  3. 遍历所有属性
import java.lang.reflect.Field;/** * 读写属性 * @author king * */public class Demo3 {public static void main(String[] args) throws Exception {Student s=new Student();// s.age=10;//写// System.err.println(s.age);//读//公共属性Class c=Class.forName("test.Student");Field ageField=c.getField("age");ageField.set(s, 20);System.out.println(ageField.get(s));//私有属性Field sidField=c.getDeclaredField("sid");//只要想调私有的方法或者属性就要调用getDeclared的方法sidField.setAccessible(true);sidField.set(s, "s001");System.out.println(ageField.get(s));}}

7.方法的调用

  1. 调用公共无参方法
  2. 调用公共有参数方法
  3. 调用私有有参方法
  4. 遍历所有方法
import java.lang.reflect.Method;/** * 调用方法 * @author king * */public class Demo4 {public static void main(String[] args) throws Exception {Student s=new Student();s.setSname("小明");s.hello();Class c=Class.forName("test.Student");Method helloMethod=c.getMethod("hello");helloMethod.invoke(s);helloMethod=c.getMethod("hello",String.class);Object o=helloMethod.invoke(s, "wwww");System.out.println(o);Method addMethod=c.getDeclaredMethod("add", Integer.class,Integer.class);addMethod.setAccessible(true);Integer n=(Integer)addMethod.invoke(s, 10,20);System.out.println(n);}}

如果还有什么不懂的,可以下载源码学习    

总节:总的来说,java反射机制是一个很好用的东西,用它可以解决很多死的东西,因为反射机制的灵活行很大,有了他,我们就不要花太多的时间来写操做数据库的代码了,而是方法更多的时间在项目的逻辑功能上这个可以很大的减少开发时间,而且代码的可读性好。先在的很多开源框架都是才用的反射机制,它只要配置文件,然后按规则来调用他的方法就可以了。

------------------如果大家喜欢我的博客,可以点击左上角的关注哦。

 

转载地址:http://pupti.baihongyu.com/

你可能感兴趣的文章
python循环语句与C语言的区别
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
vue2.* 中 使用socket.io
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>