- 浏览: 480457 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (437)
- Windows设置 (2)
- oracle数据库 (39)
- bug--jsp (4)
- j2se (13)
- js (40)
- bug-tomcat不能启动程序 (1)
- Hibernate (29)
- eclipse (20)
- java (65)
- 设计模式 (6)
- bug (18)
- PL/SQL (11)
- 前台 (5)
- 杂谈 (25)
- UML (1)
- jdbc编程 (2)
- 技术调研 (1)
- 数据通信 (2)
- ios (1)
- servlet自学笔记 (10)
- tomcat (9)
- SQL学习笔记 (6)
- java工具 (1)
- 数据库设计 (4)
- javascript (10)
- jsp (11)
- struts (17)
- ajax (7)
- linix/Unix (6)
- 资源 (3)
- spring (14)
- 算法 (5)
- 计算机网络 (2)
- http (5)
- c++ (2)
- web应用 (3)
- jvm (5)
- java中的字符编码 (14)
- java代码库 (2)
- classloader (1)
- 读书笔记 (1)
- c (1)
- 开源软件 (1)
- svn (1)
- AOP (1)
- java序列化 (1)
- 多线程 (4)
- The legendary programmers (1)
- Apache http Server (1)
- html tag (3)
- struts1.X学习笔记 (5)
- buffalo (1)
- 自己收藏 (0)
- TOEFL(IBT) (1)
- 网络翻墙 (0)
- 编译原理 (1)
- 书籍推荐 (1)
- css (10)
- javaee环境搭建资料 (1)
- 开源工具 (1)
- 美国生活 (1)
- spring自学 (3)
- log4j (3)
- 算法与数据结构 (5)
- 病毒,插件处理大全 (1)
- flex (2)
- webservice (1)
- git (7)
- cs (1)
- html (4)
- javaee (6)
- 开车 (0)
- springmvc (3)
- 互联网架构 (2)
- intellij idea (18)
- maven (15)
- mongodb (2)
- nginx (1)
- react (3)
- java基础例子 (2)
- springboot (2)
- 培训 (5)
- mysql (3)
- 数据库 (3)
- 生活 (2)
- intellij (3)
- linux (2)
- os (3)
最新评论
-
潇洒天涯:
[color=blue][color=cyan] ...
oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 -
hekai1990:
受教了..
oracle中的varchar2
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”。以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些Java基础知识,希望对大家有所帮助。):
[1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081
[2] Java动态代理-->Spring AOP :http://www.iteye.com/topic/1123293
[3] 属性编辑器,即PropertyEditor-->Spring IoC:http://www.iteye.com/topic/1123628
[4] XML基础知识-->Spring配置:http://www.iteye.com/topic/1123630
[5] 注解-->Spring配置:http://www.iteye.com/topic/1123823
[6] 线程本地变量,即ThreadLocal-->Spring事务管理:http://www.iteye.com/topic/1123824
[7] 事务基础知识-->Spring事务管理
[8] 国际化信息-->MVC
[9] HTTP请求报文-->MVC
Java语言允许通过程序化的方式间接对Class进行操作,Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数、属性和方法等。Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能,这就为使用程序化方式操作Class对象开辟了途径。
简单实例
我们将从一个简单例子开始探访Java反射机制的征程,下面的Car类拥有两个构造函数、两个方法以及三个属性,如代码清单3-9所示:
代码清单3-9 Car
一般情况下,我们会使用如下的代码创建Car的实例:
或者:
以上两种方法都采用传统方式的直接调用目标类的方法,下面我们通过Java反射机制以一种更加通用的方式间接地操作目标类:
代码清单3-10 ReflectTest
运行以上程序,在控制台上将打印出以下信息:
这说明我们完全可以通过编程方式调用Class的各项功能,这和直接通过构造函数和方法调用类功能的效果是一致的,只不过前者是间接调用,后者是直接调用罢了。
在ReflectTest中,使用了几个重要的反射类,分别是ClassLoader、Class、Constructor和Method,通过这些反射类就可以间接调用目标Class的各项功能了。在①处,我们获取当前线程的ClassLoader,然后通过指定的全限定类“com.baobaotao.beans.Car”装载Car类对应的反射实例。在②处,我们通过Car的反射类对象获取Car的构造函数对象cons,通过构造函数对象的newInstrance()方法实例化Car对象,其效果等同于new Car()。在③处,我们又通过Car的反射类对象的getMethod(String methodName,Class paramClass)获取属性的Setter方法对象,第一个参数是目标Class的方法名;第二个参数是方法入参的对象类型。获取方法反射对象后,即可通过invoke(Object obj,Object param)方法调用目标类的方法,该方法的第一个参数是操作的目标类对象实例;第二个参数是目标方法的入参。
在代码清单3 10中,粗体所示部分的信息即是通过反射方法操控目标类的元信息,如果我们将这些信息以一个配置文件的方式提供,就可以使用Java语言的反射功能编写一段通用的代码对类似于Car的类进行实例化及功能调用操作了。
类装载器ClassLoader
类装载器工作机制
类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:
[1.]装载:查找和导入Class文件;
[2.]链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的:
[2.1]校验:检查载入Class文件数据的正确性;
[2.2]准备:给类的静态变量分配存储空间;
[2.3]解析:将符号引用转成直接引用;
[3.]初始化:对类的静态变量、静态代码块执行初始化工作。
类装载工作由ClassLoader及其子类负责,ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件。JVM在运行时会产生三个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器)。其中,根装载器不是ClassLoader的子类,它使用C++编写,因此我们在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类。其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载Classpath路径下的类包。
这三个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoader的父装载器。默认情况下,使用AppClassLoader装载应用程序的类,我们可以做一个实验:
代码清单3-11 ClassLoaderTest
运行以上代码,在控制台上将打出以下信息:
parent loader:sun.misc.Launcher$ExtClassLoader@15601ea
//①根装载器在Java中访问不到,所以返回null
grandparent loader:null
通过以上的输出信息,我们知道当前的ClassLoader是AppClassLoader,父ClassLoader是ExtClassLoader,祖父ClassLoader是根类装载器,因为在Java中无法获得它的句柄,所以仅返回null。
JVM装载类时使用“全盘负责委托机制”,“全盘负责”是指当一个ClassLoader装载一个类的时,除非显式地使用另一个ClassLoader,该类所依赖及引用的类也由这个ClassLoader载入;“委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写了一个恶意的基础类(如java.lang.String)并装载到JVM中将会引起多么可怕的后果。但是由于有了“全盘负责委托机制”,java.lang.String永远是由根装载器来装载的,这样就避免了上述事件的发生。
ClassLoader重要方法
在Java中,ClassLoader是一个抽象类,位于java.lang包中。下面对该类的一些重要接口方法进行介绍:
除JVM默认的三个ClassLoader以外,可以编写自己的第三方类装载器,以实现一些特殊的需求。类文件被装载并解析后,在JVM内将拥有一个对应的java.lang.Class类描述对象,该类的实例都拥有指向这个类描述对象的引用,而类描述对象又拥有指向关联ClassLoader的引用,如图3-4所示。
每一个类在JVM中都拥有一个对应的java.lang.Class对象,它提供了类结构信息的描述。数组、枚举、注解以及基本Java类型(如int、double等),甚至void都拥有对应的Class对象。Class没有public的构造方法。Class对象是在装载类时由JVM通过调用类装载器中的defineClass()方法自动构造的。
Java反射机制
Class反射对象描述类语义结构,可以从Class对象中获取构造函数、成员变量、方法类等类元素的反射对象,并以编程的方式通过这些反射对象对目标类对象进行操作。这些反射对象类在java.reflect包中定义,下面是最主要的三个反射类:
2)Class[] getParameterTypes():获取方法的入参类型数组;
3)Class[] getExceptionTypes():获取方法的异常类型数组;
4)Annotation[][] getParameterAnnotations():获取方法的注解信息,JDK 5.0中的新方法;
此外,Java还为包提供了Package反射类,在JDK 5.0中还为注解提供了AnnotatedElement反射类。总之,Java的反射体系保证了可以通过程序化的方式访问目标类中所有的元素,对于private或protected的成员变量和方法,只要JVM的安全机制允许,也可以通过反射进行调用,请看下面的例子:
代码清单3-12 PrivateCarReflect
color变量和drive()方法都是私有的,通过类实例变量无法在外部访问私有变量、调用私有方法的,但通过反射机制却可以绕过这个限制:
代码清单3-13 PrivateCarReflect
运行该类,打印出以下信息:
在访问private、protected成员变量和方法时必须通过setAccessible(boolean access)方法取消Java语言检查,否则将抛出IllegalAccessException。如果JVM的安全管理器设置了相应的安全机制,调用该方法将抛出SecurityException。
这些文章摘自于我的《Spring 3.x企业应用开发实战》,我将通过连载的方式,陆续在此发出。欢迎大家讨论
发表评论
-
DelegatingFilterProxy管理过滤器详解
2019-02-09 03:56 497安全过滤器链 Spring Security的web架 ... -
【转】Spring的DAO异常-你可能忽视的异常
2018-10-11 05:04 470Spring的DAO框架没有抛出与特定技术相关的异常,例如 ... -
【转】Spring-Boot之配置文件application.properties(web性能)
2018-06-04 01:11 1186Spring-Boot配置文件web性能(服务器)配 ... -
【转】Spring in Action 4th 学习笔记 之 AOP
2017-11-14 10:56 461http://www.cnblogs.com/larryz ... -
spring(springmvc)配置经验
2017-11-05 21:05 01.所有集成的第三方框架(第三方jar包)都需要转换包下的转 ... -
【转】解惑 spring 嵌套事务
2017-10-12 23:17 389解惑 spring 嵌套事务 /* ... -
【转】Eclipse编辑Spring配置文件xml时自动提示类class包名
2017-10-12 20:01 1283第一步,先查看下自己的Eclipse是什么版本,步骤如下: ... -
spring配置文件头部配置解析
2017-10-09 20:03 759最近由于公司的项目用springmvc,所以自己也必须学习了 ... -
【转】载入spring配置文件的方式
2017-03-14 15:36 253获得spring中定义的bean实例(对象). Clas ... -
【转】Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)
2016-12-13 15:05 717http://www.cnblogs.com/hoojo ... -
【转】Spring中Quartz的配置
2016-01-03 19:52 752Quartz是一个强大的企业级任务调度框架,Spring中继 ... -
【转】Spring + JdbcTemplate + JdbcDaoSupport
2015-05-12 11:26 511首先,数据库是这样的,很简单。 当然,要引入sprin ... -
【转】Spring Aop实例 .
2015-03-03 15:57 1110一、XML方式 1. TestAspect:切面类 ... -
【转】很详细的spirng+struts+hibernate实例
2012-12-13 14:17 2323本文并不想介绍Struts,Spring,Hiber ...
相关推荐
主题:学习Spring必学的Java基础知识(1)----反射主题:学习Spring必学的Java基础知识(1)----反射主题:学习Spring必学的Java基础知识(1)----反射
学习Spring必学的Java基础知识(含数据库事务基础知识)
java运行依赖jar包
赠送jar包:spring-cloud-alibaba-sentinel-gateway-2021.1.jar; 赠送原API文档:spring-cloud-alibaba-sentinel-gateway-2021.1-javadoc.jar; 赠送源代码:spring-cloud-alibaba-sentinel-gateway-2021.1-sources...
赠送jar包:spring-cloud-starter-alibaba-sentinel-2021.1.jar; 赠送原API文档:spring-cloud-starter-alibaba-sentinel-2021.1-javadoc.jar; 赠送源代码:spring-cloud-starter-alibaba-sentinel-2021.1-sources...
赠送jar包:spring-cloud-starter-alibaba-nacos-config-2021.1.jar; 赠送原API文档:spring-cloud-starter-alibaba-nacos-config-2021.1-javadoc.jar; 赠送源代码:spring-cloud-starter-alibaba-nacos-config-...
赠送jar包:spring-cloud-alibaba-sentinel-datasource-2021.1.jar; 赠送原API文档:spring-cloud-alibaba-sentinel-datasource-2021.1-javadoc.jar; 赠送源代码:spring-cloud-alibaba-sentinel-datasource-2021....
学习spring不可少的包,commons-logging.java,hamcrest-core-1.3.java,junit-4.11.java,log4j-1.2.17.java,mysql-connector-java-5.1.39-bin.java,spring-aop-4.2.9.RELEASE.java,spring-beans-4.2.9.RELEASE.java,...
赠送jar包:spring-cloud-openfeign-core-3.0.4.jar; 赠送原API文档:spring-cloud-openfeign-core-3.0.4-javadoc.jar; 赠送源代码:spring-cloud-openfeign-core-3.0.4-sources.jar; 赠送Maven依赖信息文件:...
基于Spring框架的Java Web项目--问卷调查系统
赠送jar包:spring-boot-actuator-autoconfigure-2.5.5.jar; 赠送原API文档:spring-boot-actuator-autoconfigure-2.5.5-javadoc.jar; 赠送源代码:spring-boot-actuator-autoconfigure-2.5.5-sources.jar; 赠送...
Spring MVC学习(四)-------Controller接口控制器详解3
赠送jar包:spring-cloud-starter-alibaba-seata-2021.1.jar; 赠送原API文档:spring-cloud-starter-alibaba-seata-2021.1-javadoc.jar; 赠送源代码:spring-cloud-starter-alibaba-seata-2021.1-sources.jar; ...
赠送jar包:spring-web-5.2.7.RELEASE.jar; 赠送原API文档:spring-web-5.2.7.RELEASE-javadoc.jar; 赠送源代码:spring-web-5.2.7.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-web-5.2.7.RELEASE.pom;...
Spring基础讲义-java 入门必备Spring基础讲义-java 入门必备Spring基础讲义-java 入门必备Spring基础讲义-java 入门必备Spring基础讲义-java 入门必备Spring基础讲义-java 入门必备Spring基础讲义-java 入门必备...
spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-dependencies.zip spring-framework-2.0-with-...
赠送jar包:spring-boot-test-autoconfigure-2.0.6.RELEASE.jar; 赠送原API文档:spring-boot-test-autoconfigure-2.0.6.RELEASE-javadoc.jar; 赠送源代码:spring-boot-test-autoconfigure-2.0.6.RELEASE-sources...
wx-java-miniapp-spring-boot-starter-4.0.9.B.jar wx-java-mp-spring-boot-starter-4.0.9.B.jar wx-java-open-spring-boot-starter-4.0.9.B.jar wx-java-pay-spring-boot-starter-4.0.9.B.jar wx-java-qidian-...
spring-cloud-config + spring-cloud-bus-amqp实现分布式集群配置动态更新,可更新实例对象,包含源码包+Rabbitmq安装包和安装说明
spring-framework-2.5.6-with-dependencies 有点大,就打了3个包。