第16篇-JAVA 类加载与反射

第16篇-JAVA 类加载与反射

  • 每篇一句 :敢于弯曲,是为了更坚定的站立
  • 初学心得: 追求远中的欢声笑语,追求远中的结伴同行
  • (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-12| JAVA 类加载与反射 ]

1.类加载

  • 类加载器负责将 .class 文件(可能在磁盘上, 也可能在网络上) 加载到内存中, 并为之生成对应的 java.lang.Class 对象
  • 当程序主动使用某个类时,如果该类还未被加载到内存中,系统会通过加载、连接、初始化三个步骤来对该类进行初始化,如果没有意外,JVM将会连续完成这三个步骤,所以有时也把这三个步骤统称为类加载或类初始化。
  • 类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序使用任何类时,系统都会为之建立一个java.lang.Class对象

2.类数据的来源

通过使用不同的类加载器,可以从不同来源加载类的二进制数据,通常有如下几种来源:

  • 从本地文件系统来加载class文件,这是前面绝大部分示例程序的类加载方式。
  • 从JAR包中加载class文件,这种方式也是很常见的,前面介绍JDBC编程时用到的数据库驱动类就是放在JAR文件中,JVM可以从JAR文件中直接加载该class文件
  • 通过网络在加载class文件
  • 把一个Java源文件动态编译、并执行加载

3.类的连接

当类被加载之后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段将会负责把类的二进制数据合并到JRE中

类连接又可分为如下三个阶段:

  • 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致
  • 准备:类准备阶段则负责为类的静态属性分配内存,并设置默认初始值
  • 解析:将类的二进制数据中的符号引用替换成直接引用

4.类加载器

类加载器负责将.class文件(可能在磁盘上,也可能在网络上)加载到内存中,并为之生成对应的java.lang.Class对象

当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构:

  • Bootstrap ClassLoader:根类加载器。
  • Extension ClassLoader:扩展类加载器。
  • System ClassLoader:系统类加载器

5.什么是反射

反射就是把Java类中的各种成分映射成一个个的java对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象

6.Class类

Class类用于表示.class文件 
如何得到某个class文件对应的class对象

1.类名.class,
2.对象.getClass()
3.Class.forName(“类名”)

数组类型的Class实例对象

Class.isArray()

7.Constructor类

Constructor类的实例对象代表类的一个构造方法 
得到某个类所有的构造方法,例:

Constructor [] constructors= Class.forName("java.lang.String").getConstructors();

得到某一个构造方法,例:

Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);

利用构造方法创建实例对象:

String str = (String)constructor.newInstance(“abc”);

Class类的newInstance()方法也可创建类的实例,其内部工作原理是先得无参的构造方法,再用构造方法创建实例对象

String obj =(String)Class.forName("java.lang.String").newInstance();

8.内省(Introspector)

访问JavaBean属性的两种方式

  • 直接调用bean的setXXX或getXXX方法
  • 通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式
  • 通过PropertyDescriptor类操作Bean的属性
  • 通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法

内省—beanutils工具包 
Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写

Beanutils工具包的常用类:

  • BeanUtils
  • PropertyUtils
  • ConvertUtils.regsiter(Converter convert, Class clazz)
  • 自定义转换器

9.反射案例

1.package com.mvc.bean;
2.import com.mvc.service.imp.UserServiceImp;
3.import java.util.ResourceBundle;
4./**
5. * Created by JEEP-711 
6. */
7.public class BeanFactory {
8.    private static ResourceBundle bundle;
9.    static {
10.        bundle = ResourceBundle.getBundle("instance"); //文件内容
11.    }
12.    public static <T> T getInstance(String key, Class<T> clazz){
13.        try {
14.            String className = bundle.getString(key);//类的全路径
15.            return (T)Class.forName(className).newInstance();//反射方式
16.        } catch (Exception e) {
17.            throw new RuntimeException(e);
18.        }
19.    }
20.}
1.package com.mvc.controller;
2.import com.alibaba.fastjson.JSON;
3.import com.mvc.bean.BeanFactory;
4.import com.mvc.bean.Type;
5.import com.mvc.service.ITypeService;
6.import com.mvc.service.imp.TypeServiceImpl;
7.import org.apache.commons.beanutils.BeanUtils;
8.import javax.servlet.ServletException;
9.import javax.servlet.http.HttpServlet;
10.import javax.servlet.http.HttpServletRequest;
11.import javax.servlet.http.HttpServletResponse;
12.import java.io.IOException;
13.import java.io.Writer;
14.import java.util.List;
15./**
16. * Created by JEEP-711 
17. */
18.public class TypeServlet extends HttpServlet{
19.                                               //反射
20.ITypeService iTypeService = BeanFactory.getInstance("typeService",ITypeService.class);
21.    @Override
22.    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
23.        resp.setContentType("text/html;charset=UTF-8");//设置UTF-8编码格式
24.        req.setCharacterEncoding("UTF-8");//设置UTF-8编码格式
25.        String method = req.getParameter("m");
26.        if("add".equals(method)){
27.            add(req,resp);//调用add方法
28.        }else if("update".equals(method)){
29.            update(req,resp);//调用修改方法
30.        }else if("ajax_all".equals(method)){
31.            ajaxAll(req,resp);
32.        }else if("delete".equals(method)){
33.            delete(req,resp);
34.        }else {
35.            index(req,resp);//调用错误方法
36.        }
37.    }
38.}

初学(JAVA 类加载与反射 高级阶段) 难点: ★★★★★

希望每一篇文章都能够对读者们提供帮助与提升,这乃是每一位笔者的初衷


感谢您的阅读 欢迎您的留言与建议

时间: 2024-12-21 21:10:59

第16篇-JAVA 类加载与反射的相关文章

JAVA学习篇--Java类加载

由来: 与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序(解释性语言).当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Javaclass加载到JVM里头运行,负责加载Javaclass的这部分就ClassLoader.中文叫做类加载器. 类加载器就好比一个代理,你需要什么,我通过类加载器将你需要的内容返回给你! 类加载器有什么作用? 当程序需要的某个类,那么需要通过类加载器把类的二进制加载到内存中. 解释: 类加载器也是Java类,因为其他是java类的

Java类加载、反射及练习整理

类加载器 1.1      类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 就是指将class文件读入内存,并为之创建一个Class对象. 任何类被使用时系统都会建立一个Class对象 连接 验证 是否有正确的内部结构,并和其他类协调一致 准备 负责为类的静态成员分配内存,并设置默认初始化值 解析 将类的二进制数据中的符号引用替换为直接引用 初始化 就是我们以前讲过的初始化步骤 1.2      类初始化时机 1.

第二篇 java中的反射

java中的反射 一.反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.要想解剖一个类,必须先要获取到该类的字节码文件对象. 而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象. 1.创建实体类 1 public class User { 2 private int id; 3 pr

浅说Java中的反射机制(二)

写过一篇Java中的反射机制,不算是写,应该是抄了,因为那是别人写的,这一篇也是别人写的,摘抄如下: 引自于Java基础--反射机制的知识点梳理,作者醉眼识朦胧.(()为我手记) 什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量.成员方法.构造方法等,反射可以通过加载类(加载类是个什么东西?一直搞不清楚),解剖出类的各个组成部分. 为什么要用反射? 我们需要访问一个

Java类加载器的工作原理

Java类加载器的作用就是在运行时加载类.Java类加载器基于三个机制:委托.可见性和单一性.委托机制是指将加载一个类的请求交给父类加载 器,如果这个父类加载器不能够找到或者加载这个类,那么再加载它.可见性的原理是子类的加载器可以看见所有的父类加载器加载的类,而父类加载器看不到子类 加载器加载的类.单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类.正确理解类加载器能够帮你解决 NoClassDefFoundError和java.lang.ClassNo

第5篇-JAVA面向对象Ⅰ

第5篇-JAVA面向对象Ⅰ 每篇一句 :面向对象面向君,不负代码不负卿 初学心得: 代码虐我千百遍,我待代码如初恋 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-03| JAVA面向对象 Ⅰ] 1.JAVA作为一种面向对象语言,具有以下基本概念: ● 多态 ● 继承 ● 封装 ● 抽象 ● 类 ● 对象 ● 实例 ● 方法 ● 重载 2.面向对象 什么是面向对象?: 面向对象是一种编程思想 通俗的说:面向对象是一种思考问题的思维方式 为什么使用面向对象以及它的作用 计算机语

Java系列笔记(2) - Java RTTI和反射机制

目录 前言 传统的RTTI 反射 反射的实现方式 反射的性能 反射与设计模式 前言 并不是所有的Class都能在编译时明确,因此在某些情况下需要在运行时再发现和确定类型信息(比如:基于构建编程,),这就是RTTI(Runtime Type Information,运行时类型信息). 在java中,有两种RTTI的方式,一种是传统的,即假设在编译时已经知道了所有的类型:还有一种,是利用反射机制,在运行时再尝试确定类型信息. 本文主要讲反射方式实现的RTTI,建议在阅读本文之前,先了解类的加载机制(

第17篇-JAVA Annotation 注解

第17篇-JAVA Annotation 注解 每篇一句 :真的努力后你会发现自己要比想象的优秀很多 初学心得: 怀着一颗奋斗不息的心,一切困苦艰辛自当迎刃而解 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-05-17| JAVA Annotation注解 ] 1.什么是注解(Annotation) Annotation 其实就是代码里的特殊标记, 它用于替代配置文件,也就是说,传统方式通过配置文件告诉类如何运行,有了注解技术后,开发人员可以通过注解告诉类如何运行.在Java技术

黑马程序员——【Java高新技术】——反射机制

---------- android培训.java培训.期待与您交流! ---------- 一.概述 1.Java反射机制:是指“在运行状态中”,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.Java反射机制主要提供了以下功能: (1)在运行时,判断任意一个对象所属的类 (2)在运行时,构造任意一个类的对象 (3)在运行时,判断任意一个类所具有的成员变量和方