当前位置: 首页 > news >正文

国家建设部网站证书查询百度竞价推广课程

国家建设部网站证书查询,百度竞价推广课程,wordpress 版权声明,王烨诡异复苏的漫画叫什么反射的优势和劣势 在运行状态下,对于任意一个类都能够知道这个类的所有属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制. 更多使用参考这篇博客:https://blog.csdn.net/sinat_38259539/articl…

反射的优势和劣势

       在运行状态下,对于任意一个类都能够知道这个类的所有属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法,这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制.

更多使用参考这篇博客:https://blog.csdn.net/sinat_38259539/article/details/71799078

反射的作用(就是解剖一个类)

  1. 动态的加载类,动态的获取类的信息(属性,方法,构造器)
  2. 动态的构造对象
  3. 动态调用类和对象的任意方法,构造器
  4. 获取泛型信息
  5. 处理注解

  个人理解,反射机制实际上就是上帝模式,如果说方法的调用是 Java 正确的打开方式,那反射机制就是上帝偷偷开的后门,只要存在对应的class,一切都能够被调用。

  那上帝为什么要打开这个后门呢?这涉及到了静态和动态的概念

  • 静态编译:在编译时确定类型,绑定对象
  • 动态编译:运行时确定类型,绑定对象

  两者的区别在于,动态编译可以最大程度地支持多态,而多态最大的意义在于降低类的耦合性,因此反射的优点就很明显了:解耦以及提高代码的灵活性。

  因此,反射的优势和劣势分别在于:

  • 优势

    • 运行期类型的判断,动态类加载:提高代码灵活度
  • 劣势

    • 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多

反射的应用场景

反射是框架设计的灵魂。

在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。

举例:①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性

  在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架,也是利用 反射机制才得以实现,下面就举例最常见的两个例子,来说明反射机制的强大之处:

  • JDBC 的数据库的连接

在JDBC 的操作中,如果要想进行数据库的连接,则必须按照以上的几步完成

  1. 通过Class.forName()加载数据库的驱动程序 (通过反射加载,前提是引入相关了Jar包)
  2. 通过 DriverManager 类进行数据库的连接,连接的时候要输入数据库的连接地址、用户名、密码
  3. 通过Connection 接口接收连接
public class ConnectionJDBC {  /** * @param args */  //驱动程序就是之前在classpath中配置的JDBC的驱动程序的JAR 包中  public static final String DBDRIVER = "com.mysql.jdbc.Driver";  //连接地址是由各个数据库生产商单独提供的,所以需要单独记住  public static final String DBURL = "jdbc:mysql://localhost:3306/test";  //连接数据库的用户名  public static final String DBUSER = "root";  //连接数据库的密码  public static final String DBPASS = "";  public static void main(String[] args) throws Exception {  Connection con = null; //表示数据库的连接对象  Class.forName(DBDRIVER); //1、使用CLASS 类加载驱动程序 ,反射机制的体现 con = DriverManager.getConnection(DBURL,DBUSER,DBPASS); //2、连接数据库  System.out.println(con);  con.close(); // 3、关闭数据库  } 

 

  • Spring 框架的使用

  在 Java的反射机制在做基础框架的时候非常有用,行内有一句这样的老话:反射机制是Java框架的基石。一般应用层面很少用,不过这种东西,现在很多开源框架基本都已经封装好了,自己基本用不着写。典型的除了hibernate之外,还有spring也用到很多反射机制。最经典的就是xml的配置模式。

Spring 通过 XML 配置模式装载 Bean 的过程:

  1. 将程序内所有 XML 或 Properties 配置文件加载入内存中
  2. Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息
  3. 使用反射机制,根据这个字符串获得某个类的Class实例
  4. 动态配置实例的属性

Spring这样做的好处是:

  • 不用每一次都要在代码里面去new或者做其他的事情
  • 以后要改的话直接改配置文件,代码维护起来就很方便了
  • 有时为了适应某些需求,Java类里面不一定能直接调用另外的方法,可以通过反射机制来实现

模拟 Spring 加载 XML 配置文件:

public class BeanFactory {private Map<String, Object> beanMap = new HashMap<String, Object>();/*** bean工厂的初始化.* @param xml xml配置文件*/public void init(String xml) {try {//读取指定的配置文件SAXReader reader = new SAXReader();ClassLoader classLoader = Thread.currentThread().getContextClassLoader();//从class目录下获取指定的xml文件InputStream ins = classLoader.getResourceAsStream(xml);Document doc = reader.read(ins);Element root = doc.getRootElement();  Element foo;//遍历beanfor (Iterator i = root.elementIterator("bean"); i.hasNext();) {  foo = (Element) i.next();//获取bean的属性id和classAttribute id = foo.attribute("id");  Attribute cls = foo.attribute("class");//利用Java反射机制,通过class的名称获取Class对象Class bean = Class.forName(cls.getText());//获取对应class的信息java.beans.BeanInfo info = java.beans.Introspector.getBeanInfo(bean);//获取其属性描述java.beans.PropertyDescriptor pd[] = info.getPropertyDescriptors();//设置值的方法Method mSet = null;//创建一个对象Object obj = bean.newInstance();//遍历该bean的property属性for (Iterator ite = foo.elementIterator("property"); ite.hasNext();) {  Element foo2 = (Element) ite.next();//获取该property的name属性Attribute name = foo2.attribute("name");String value = null;//获取该property的子元素value的值for(Iterator ite1 = foo2.elementIterator("value"); ite1.hasNext();) {Element node = (Element) ite1.next();value = node.getText();break;}for (int k = 0; k < pd.length; k++) {if (pd[k].getName().equalsIgnoreCase(name.getText())) {mSet = pd[k].getWriteMethod();//利用Java的反射极致调用对象的某个set方法,并将值设置进去mSet.invoke(obj, value);}}}//将对象放入beanMap中,其中key为id值,value为对象beanMap.put(id.getText(), obj);}} catch (Exception e) {System.out.println(e.toString());}}//other codes
}

Java获取反射的三种方法

public class Get {//获取反射机制三种方式public static void main(String[] args) throws ClassNotFoundException {//方式一(通过建立对象)Student stu = new Student();Class classobj1 = stu.getClass();System.out.println(classobj1.getName());//方式二(所在通过路径-相对路径)Class classobj2 = Class.forName("fanshe.Student");System.out.println(classobj2.getName());//方式三(通过类名)Class classobj3 = Student.class;System.out.println(classobj3.getName());}
}

 

http://www.lbrq.cn/news/2449207.html

相关文章:

  • 网站建设从哪几个情况去判如何建造一个网站
  • 恢复被百度k网站 关键词收录小学生抄写新闻20字
  • 沈阳网站建设聚艺科技经典广告语
  • wordpress模板百度云信阳seo推广
  • 做我女朋友套路网站广东省广州市佛山市
  • 自动做网站百度推广竞价是什么意思
  • 山东省住房和建设网站bt兔子磁力搜索
  • 潍坊科技网站建设西安网站建设推广优化
  • 网站建设佰金手指科杰二网站策划方案书
  • wordpress远程代码执行网站搜索引擎优化情况怎么写
  • 0基础如何快速做网站营销团队外包
  • 做搜狗网站优化排名怎么找当地的地推团队
  • 商城网站开发哪家好百度推广代理商赚钱吗
  • 国外网站首页设计腾讯企点注册
  • 广州网站营销推广设计建设网站的网站首页
  • 那么多网站都是谁做的福州百度seo代理
  • 好看的网站分享seo关键词排名优化要多少钱
  • 宁波做网站建设推广我们公司在做网站推广
  • wordpress 文章缩放南京seo外包
  • 做电影下载网站需要什么百度最新秒收录方法2023
  • 深圳购物网站建设报价沈阳关键词自然排名
  • 百度做的网站靠谱吗品牌推广百度seo
  • 旅游自媒体网站怎么做百度网址大全手机版
  • 网站访问量什么意思关键词优化一年的收费标准
  • wordpress网站不显示菜单电商网站订烟
  • 自己做网站挂广告怎么赚钱seo云优化是什么意思
  • 网站怎么做竞价建站公司网站源码
  • 简易东莞网站制作公司网络营销带来的效果
  • icp备案网站app开发费用一览表
  • 网站建设要用到编程吗sem推广竞价托管公司
  • freqtrade关于获取k线数量,以及显示时间的问题
  • OSPF 协议(多区域)
  • 人工智能概述
  • 算法调试技巧
  • API安全监测工具:数字经济的免疫哨兵
  • JavaScript 02 数据类型和运算符数组对象