分类目录归档:Java基础

理解Java虚拟机体系结构

来源:LeoLiang

1 概述

众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操作系统是什么。正是得益于Java虚拟机,它号称的“一次编译,到处运行”才能有所保障。

1.1 Java程序执行流程

Java程序的执行依赖于编译环境和运行环境。源码代码转变成可执行的机器代码,由下面的流程完成:

继续阅读

发表在 Java基础 | 标签为 | 留下评论

JVM概述

来源:冰河

JVM是什么

JVM全称是Java Virtual Machine(java虚拟机)。它之所以被称之为是“虚拟”的,就是因为它仅仅是由一个规范来定义的抽象计算机。我们平时经常使用的Sun HotSpot虚拟机只是其中一个具体的实现(另外还有BEA JRockit、IBM J9等等虚拟机)。

JVM的设计目标是提供一个基于抽象规格描述的计算机模型,为解释程序开发人员提供很好的灵活性,同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义,特别是对Java可执行代码,即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。

JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。

JRE/JDK/JVM是什么关系

继续阅读

发表在 Java基础 | 留下评论

Java泛型•约束和局限性

来源:Yuan Shenjian

泛型参数的限制

在Java中,实例化泛型类时泛型参数不能使用基本类型,如List<int>这是不合法的,要存储基本类型则可以利用基本类型的包装类如List<Integer> 、List<Double>等,下面补充一下八种基本类型对应的包装类,和默认初始值

继续阅读

发表在 Java基础 | 标签为 | 留下评论

Java泛型•虚拟机执行泛型代码

来源:Yuan Shenjian

虚拟机中类型擦除

Java虚拟机是不存在泛型类型对象的所有的对象都属于普通类,甚至在泛型实现的早起版本中,可以将使用泛型的程序编译为在1.0虚拟机上能够运行的class文件,这个向后兼容性后期被抛弃了,所以后来如果用Sun公司的编译器编译的泛型代码,是不能运行在Java5.0之前的虚拟机的,这样就导致了一些实际生产的问题,如一些遗留代码如何跟新的系统进行衔接,要弄明白这个问题,需要先了解一下虚拟机是怎么执行泛型代码的。

虚拟机的一种机制:擦除类型参数,并将其替换成特定类型,没有指定特定类型用Object代替,如前文中的Couple类,虚拟机擦除后:

继续阅读

发表在 Java基础 | 标签为 | 留下评论

Java泛型•通配符限定

来源:Yuan Shenjian
引一个例子

考虑一个这样的场景,计算数组中的最大元素。

[code01]

public class ArrayUtil {
    public static <T> T max(T[] array) {
        if (array == null || 0 == array.length) { return null ;}
        T max = array[0];
        for (int i = 1; i < array.length; i++) {
            if (max.compareTo(array[i]) < 0) {max = array[i];}
        }
        return max;
    }
}

 

仔细看看code01里面的代码(代码不完整),使用类型参数T定义一个max局部变量,这几意味着这个max可以是任意的类型,那么max.compareTo(array[i]) 方法的调用的前提是T所属的类中有compareTo方法怎么能做到这一点呢?别着急,让我们来看看如何给类型参数进行限定,现在来对code01中的代码进行完善。

继续阅读

发表在 Java基础 | 标签为 | 留下评论

Java泛型•认识泛型

来源:Yuan Shenjian

什么是泛型

Java从1.0版本到现在的10+,中间Java5中发生了一个很重要的变化,那就是泛型机制的引入。Java5引入了泛型,主要还是为了满足在1999年指定的最早Java规范之一。经过了5年左右的时间,专家组定义了一套泛型规范,实现后通过测试投入到使用。所以说泛型是Java5以后才有的,欲知详情,继续往下看。

为什么用泛型

换个角度想,Java5引入泛型,必定是它能带来好处,否则牛气的Java工程师就要遭到吐槽了。我们来吐槽一下没有泛型的程序是怎么写的。

继续阅读

发表在 Java基础 | 标签为 | 留下评论

泛型的意义和作用是啥?

来源:hexter

简单的说,意义和作用有:

类型的参数化,就是可以把类型像方法的参数那样传递。这一点意义非凡。

泛型使编译器可以在编译期间对类型进行检查以提高类型安全,减少运行时由于对象类型不匹配引发的异常。

泛型方法,算法的复用。蛮神奇的。

继续阅读

发表在 Java基础 | 标签为 | 留下评论

动态代理方案,优缺点比较(asm,javaassist,cglib,jdk)

来源:炫迈哥

为什么需要动态代理?

  • 如spring等这样的框架,要增强具体业务的逻辑方法,不可能在框架里面去写一个静态代理类,只能按照用户的注解或者xml配置来动态生成代理类。
  • 业务代码内,当需要增强的业务逻辑非常通用(如:添加log,重试,统一权限判断等)时,使用动态代理将会非常简单,如果每个方法增强逻辑不同,那么静态代理更加适合
  • 使用静态代理时,如果代理类和被代理类同时实现了一个接口,当接口方法有变动时,代理类也必须同时修改
    继续阅读
发表在 Java基础 | 标签为 | 留下评论

Java反射机制应用实践

来源:ziwenxie

引言

Java反射机制是一个非常强大的功能,在很多大型项目比如Spring, Mybatis都可以看见反射的身影。通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式代理模式设计模式,同时也可以解决Java泛型擦除等令人苦恼的问题。本文我们就从实际应用的角度出发,来应用一下Java的反射机制

继续阅读

发表在 Java基础 | 标签为 | 留下评论

反射及用途介绍

来源:sczyh30

一、回顾:什么是反射?

反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性

Oracle 官方对反射的解释是:

Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions.
The API accommodates applications that need access to either the public members of a target object (based on its runtime class) or the members declared by a given class. It also allows programs to suppress default reflective access control.

简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译期是未知的。

继续阅读

发表在 Java基础 | 标签为 | 留下评论