- 浏览: 499731 次
- 性别:
- 来自: 沈阳
文章分类
- 全部博客 (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 544安全过滤器链 Spring Security的web架 ... -
【转】Spring的DAO异常-你可能忽视的异常
2018-10-11 05:04 532Spring的DAO框架没有抛出与特定技术相关的异常,例如 ... -
【转】Spring-Boot之配置文件application.properties(web性能)
2018-06-04 01:11 1229Spring-Boot配置文件web性能(服务器)配 ... -
【转】Spring in Action 4th 学习笔记 之 AOP
2017-11-14 10:56 496http://www.cnblogs.com/larryz ... -
spring(springmvc)配置经验
2017-11-05 21:05 01.所有集成的第三方框架(第三方jar包)都需要转换包下的转 ... -
【转】解惑 spring 嵌套事务
2017-10-12 23:17 417解惑 spring 嵌套事务 /* ... -
【转】Eclipse编辑Spring配置文件xml时自动提示类class包名
2017-10-12 20:01 1333第一步,先查看下自己的Eclipse是什么版本,步骤如下: ... -
spring配置文件头部配置解析
2017-10-09 20:03 791最近由于公司的项目用springmvc,所以自己也必须学习了 ... -
【转】载入spring配置文件的方式
2017-03-14 15:36 285获得spring中定义的bean实例(对象). Clas ... -
【转】Spring3 整合Hibernate3.5 动态切换SessionFactory (切换数据库方言)
2016-12-13 15:05 764http://www.cnblogs.com/hoojo ... -
【转】Spring中Quartz的配置
2016-01-03 19:52 787Quartz是一个强大的企业级任务调度框架,Spring中继 ... -
【转】Spring + JdbcTemplate + JdbcDaoSupport
2015-05-12 11:26 560首先,数据库是这样的,很简单。 当然,要引入sprin ... -
【转】Spring Aop实例 .
2015-03-03 15:57 1153一、XML方式 1. TestAspect:切面类 ... -
【转】很详细的spirng+struts+hibernate实例
2012-12-13 14:17 2371本文并不想介绍Struts,Spring,Hiber ...
相关推荐
主题:学习Spring必学的Java基础知识(1)----反射主题:学习Spring必学的Java基础知识(1)----反射主题:学习Spring必学的Java基础知识(1)----反射
1. **基础语法**:Java的基础语法是学习的起点,包括变量、数据类型、运算符、流程控制(如if语句、switch语句、for循环、while循环)以及方法定义等。 2. **面向对象编程**:Java是一种面向对象的语言,因此理解和...
在Java学习过程中,一个系统的学习计划能够帮助初学者...这个学习计划覆盖了从基础到进阶的全面Java知识体系,适合希望系统学习Java的人群。遵循这样的计划,开发者可以逐步提升技能,为从事Java开发工作做好充分准备。
### 一、Java基础知识 #### 1. Java语言特点 - **面向对象**:封装、继承、多态。 - **平台无关性**:通过JVM实现跨平台运行。 - **自动垃圾回收**:避免内存泄露问题。 #### 2. 数据类型 - **基本数据类型**:...
确保这些基础知识牢固,能够帮助你在后续的学习中更快速地理解和应用。 接下来,SQL和数据库知识是必备的。SQL是用于操作和管理数据库的语言,掌握基本的SQL查询、表关系、索引、事务处理等概念,可以帮助你有效地...
一、Java基础 1. Java语法:理解基本的类、对象、接口、继承和多态等概念,熟悉构造器、方法重载和重写、访问修饰符的区别。 2. 面向对象编程:深入理解封装、继承和多态的含义,以及如何在实际项目中应用。 3. ...
11. **Spring框架**: 作为Java企业级开发的主流框架,理解依赖注入(DI)和面向切面编程(AOP),以及Spring Boot和Spring Cloud的相关知识。 12. **数据库**: SQL语言基础,包括DML(增删改查)、DDL(创建表)、...
##### 2.1 Java基础知识 - **环境搭建**:了解如何安装JDK以及配置开发环境。 - **基本语法**:掌握变量、数据类型、流程控制等基础知识。 - **面向对象**:理解类与对象的概念,学会使用继承、封装、多态等特性。 ...
在学习过程中,不断通过编写小程序、参与开源项目或解决实际问题来巩固所学知识。同时,阅读优秀的Java代码,参考设计模式,将理论知识转化为实践经验。 总的来说,Java学习不仅需要理解语法和概念,还需要通过大量...
1. `java.lang.Class`: 这个类是Java反射的起点,它包含了关于Java类的所有元信息。`Class`对象可以通过以下几种方式获得: - 使用`Class.forName()`静态方法,传入完全限定类名。 - 调用对象的`getClass()`方法。...
1. **JAVA基础知识**:涵盖JAVA语法、数据类型、控制结构、类与对象、异常处理、IO流、多线程等。 2. **PYTHON基础知识**:涉及PYTHON的语法特性,如变量、字符串、列表、字典、函数、模块、面向对象编程等。 3. *...
总的来说,Java学习涵盖了广泛的领域,从基础知识到高级特性,都需要时间和实践去掌握。通过不断地练习和项目经验积累,你将成为一名熟练的Java开发者。记住,持续学习和关注最新的技术趋势,如Java的新版本特性,是...
一、Java基础 1. 类与对象:理解面向对象编程的基本概念,如封装、继承、多态,并能熟练编写类和对象。 2. 内存管理:理解Java内存模型,包括堆、栈、方法区,以及垃圾回收机制。 3. 数据类型:掌握基本数据类型和...
【标题】"java基础到spring boot " 涵盖了从Java编程语言的基本概念到Spring Boot框架的应用,这是一个从入门到实践的完整学习路径。Java是面向对象的编程语言,广泛应用于服务器端开发,它的核心特性包括类、接口、...
1. **JAVA开发基础知识**:了解JAVA语言的基本语法、变量、数据类型、运算符以及流程控制语句。熟悉Eclipse开发环境,它是JAVA开发的主流IDE,能提供代码提示和调试功能。 2. **J2SE 5.0 API**:学习标准类库,包括...
以上只是Java基础知识的冰山一角,深入学习还包括设计模式、JVM工作原理、Spring框架、数据库连接等更高级的话题。"JAVA相关基础知识.doc"文档很可能会涵盖这些内容,通过学习和实践,你可以逐步提高自己的Java编程...
1. **线程基础知识**:学习线程的创建、启动、同步和通信机制,如synchronized关键字、wait()、notify()、notifyAll()。 2. **线程池**:了解ExecutorService、ThreadPoolExecutor和ScheduledThreadPoolExecutor的...
此外,还可以探索EJB(Enterprise JavaBeans)3.0等技术,虽然它们可能不是必学的,但在某些场景下依然有用武之地,尤其是在大型企业级应用开发中。 总体而言,Java的学习路径是一个循序渐进的过程,从基础语法到...
1. **面向对象编程**:这是Java的基础,包括类、对象、封装、继承、多态等概念。理解如何设计和实现面向对象的解决方案是中级开发者必备的能力。 2. **异常处理**:理解Java中的异常类型,如何使用try-catch-...
基础知识包括Java语法,如变量、数据类型、运算符、流程控制语句(if、for、while)、类与对象、封装、继承、多态等核心概念。理解这些概念是成为Java程序员的基础。此外,学习Java集合框架,如ArrayList、...