`
sassds
  • 浏览: 154350 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中Class类工作原理详解

    博客分类:
  • java
阅读更多

1.Class对象

    Class对象包含了与类相关的信息。事实上,Class对象就是用来创建类的所有的"普通"对象的。

    类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象(恰当地说,是被保存在一个同名 的。class文件中)。在运行时,当我们想生成这个类的对象时,运行这个程序的Java虚拟机(JVM)首先检查这个类的Class对象是否已经加载。 如果尚未加载,JVM就会根据类名查找。class文件,并将其载入。

    一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。看下面示例。

    SweetShop.java

    package com.zj.sample;

    class Candy {

    static {

    System.out.println("Loading Candy");

    }

    }

    class Gum {

    static {

    System.out.println("Loading Gum");

    }

    }

    class Cookie {

    static {

    System.out.println("Loading Cookie");

    }

    }

    public class SweetShop {

    public static void main(String[] args) {

    System.out.println("inside main");

    new Candy();

    System.out.println("After creating Candy");

    try {

    Class.forName("com.zj.sample.Gum");

    } catch (ClassNotFoundException e) {

    System.out.println("Couldn't find Gum");

    }

    System.out.println("After Class.forName("Gum")");

    new Cookie();

    System.out.println("After creating Cookie");

    }

    }

    结果:

    inside main

    Loading Candy

    After creating Candy

    Loading Gum

    After Class.forName("Gum")

    Loading Cookie

    After creating Cookie

    2.获取Class实例的三种方式

    1)利用对象调用getClass()方法获取该对象的Class实例。

    2)使用Class类的静态方法forName(),用类的名字获取一个Class实例。

    3)运用。class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用。TYPE来获取相对应的基本数据类型的Class实例。

    3.Class.forName

    上面的示例中:

    Class.forName("com.zj.sample.Gum");

    这个方法是Class类(所有Class对象都属于这个类)的一个static成员。Class对象就和其它对象一样,我们可以获取并操作它的引用。 forName()是取得Class对象的引用的一种方法。它是用一个包含目标类的文本名的String作输入参数,返回的是一个Class对象的引用。

    4.类字面常量

    Java还提供了另一种方法来生成对Class对象的引用,即使用"类字面常量"。对上述程序来说,可以是:

    com.zj.sample.Gum.class;

    5.关键字instanceof

    关键字instanceof返回一个布尔值,判断是不是某个特定类型的实例。

    if(x instanceof Dog) ((Dog)x)。bark();

    6.获取Class实例

    package com.zj.sample;

    class Point {

    int x, y;

    }

    class ClassTest {

    public static void main(String[] args) {

    Point pt = new Point();

    Class c1 = pt.getClass();

    System.out.println(c1.getName());

    try {

    Class c2 = Class.forName("com.zj.sample.Point");

    System.out.println(c2.getName());

    } catch (Exception e) {

    e.printStackTrace();

    }

    Class c3 = Point.class;

    System.out.println(c3.getName());

    Class c4 = int.class;

    System.out.println(c4.getName());

    Class c5 = Integer.TYPE;

    System.out.println(c5.getName());

    Class c6 = Integer.class;

    System.out.println(c6.getName());

    }

    }

    结果:

    com.zj.sample.Point

    com.zj.sample.Point

    com.zj.sample.Point

    int

    int

    java.lang.Integer

    7.Class的其他方法

    1)Class.newInstance()使用所选的Class对象生成该类的新实例。它调用了缺省(无参数)的类构造器生成新的对象。所以使用 newInstance()创建的类必须有一个缺省构造器。对于newInstance()来说,可以在原先没有任何对象存在的情况下,使用它创建一个新 的对象。

    利用newInstance()实例化一个对象:

    package com.zj.sample;

    class Point {

    static {

    System.out.println("Loading Point");

    }

    int x, y;

    }

 

class ClassTest {

    public static void main(String[] args) {

    try {

    Class c = Class.forName("com.zj.sample.Point");

    Point pt = (Point) c.newInstance();

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    结果:

    Loading Point

    2)Class.isInstance()方法提供了一种动态地调用instanceof运算符的途径。

    3)Class.getInterfaces()方法返回Class对象的数组,这些对象代表的是某个Class对象所包含的接口。

    4)如果有一个Class对象,那么就可以通过getSuperclass()获取它的直接基类。这个方法自然也是返回一个Class引用,所以可以进一步查询其基类。这意味着在运行时,可以找到一个对象完整的类层次结构。

    5)Class类支持反射的概念,Java附带的库java.lang.reflect包含了Field、Method以及Constructor类 (每个类都实现了Member接口)。这些类型的对象是由JVM在运行时创建的,用以表示未知类里对应的成员。这样可以使用Constructor创建新 的对象,用get()和set()方法读取和修改与Field对象关联的字段,用invoke()方法调用与Method对象关联的方法。另外,还可以调 用getFields()、getMethods、getConstrucotrs()方法,返回表示字段、方法以及构造器的对象的数组。

    8.利用反射API察看未知类的构造方法与方法

    package com.zj.sample;

    import java.lang.reflect.Constructor;

    import java.lang.reflect.Method;

    class Point {

    static {

    System.out.println("Loading Point");

    }

    int x, y;

    void output() {

    System.out.println("x=" + x + "," + "y=" + y);

    }

    Point(int x, int y) {

    this.x = x;

    this.y = y;

    }

    }

    class ClassTest {

    public static void main(String[] args) {

    try {

    Class c = Class.forName("com.zj.sample.Point");

    Constructor[] cons = c.getDeclaredConstructors();

    for (int i = 0; i < cons.length; i++)// 返回所有声明的构造方法

    {

    System.out.println(cons[i]);

    }

    Method[] ms = c.getDeclaredMethods();

    for (int i = 0; i < ms.length; i++)// 返回所有声明的方法

    {

    System.out.println(ms[i]);

    }

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    结果:

    Loading Point

    com.zj.sample.Point(int,int)

    void com.zj.sample.Point.output()

    9.动态调用一个类的实例(完全没有出现point这个名字)

    package com.zj.sample;

    import java.lang.reflect.Constructor;

    import java.lang.reflect.Method;

    class Point {

    static {

    System.out.println("Loading Point");

    }

    int x, y;

    void output() {

    System.out.println("x=" + x + "," + "y=" + y);

    }

    Point(int x, int y) {

    this.x = x;

    this.y = y;

    }

    }

    class ClassTest {

    public static void main(String[] args) {

    try {

    Class c = Class.forName("com.zj.sample.Point");

    Constructor[] cons = c.getDeclaredConstructors();

    Class[] params = cons[0].getParameterTypes();// 察看构造器的参数信息

    Object[] paramValues = new Object[params.length];// 构建数组传递参数

    for (int i = 0; i < params.length; i++) {

    if (params[i].isPrimitive())// 判断class对象表示是否是基本数据类型

    {

    paramValues[i] = new Integer(i);

    }

    }

    Object o = cons[0].newInstance(paramValues);// 创建一个对象的实例

    Method[] ms = c.getDeclaredMethods();// 调用方法

    ms[0].invoke(o, null);// 用指定的参数调用(output方法没有参数,null)

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    }

    结果:

    Loading Point

    x=0,y=1

分享到:
评论

相关推荐

    Java虚拟机工作原理详解

    Java虚拟机工作原理详解 Java虚拟机工作原理详解是 Java 程序执行的核心组件之一。了解 Java 虚拟机的工作原理对 Java 开发人员来说非常重要。本文将详细介绍 Java 虚拟机工作原理的详细过程和类加载器的工作机理。...

    java反射原理详解

    在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及相关的API。通过反射,开发者可以实现以下功能: 1. **运行时加载类**:在程序运行过程中,我们...

    Java反射机制的工作原理详解.docx

    在Java中,反射机制主要通过`java.lang.Class`、`java.lang.reflect.Field`、`java.lang.reflect.Method`和`java.lang.reflect.Constructor`等类来实现。 **一、反射机制的主要功能** 1. **运行时判断对象所属的类...

    java虚拟机工作原理详解

    1. **引导类加载器(Bootstrap Class Loader)**:由C/C++实现,负责加载Java核心库,如`rt.jar`中的类,包括基础类`java.lang.Object`。 2. **扩展类加载器(Extension Class Loader)**:加载JDK的扩展库,通常...

    Java中Class对象详解.docx

    ### Java中Class对象详解 #### 一、Class对象概述 在Java编程语言中,`Class`对象是一个非常重要的概念,它代表了Java中的一个类。每个加载到Java虚拟机(JVM)中的类都有对应的`Class`对象。通过`Class`对象,...

    java中Class.forName方法的作用详解

    Java中的`Class.forName()`方法是一个非常关键的工具,主要用于动态加载类。它的作用在于根据给定的类全名(包括包名)返回对应的`Class`对象。`Class`对象是Java反射机制的基础,它代表着运行时的类信息,可以通过...

    Java虚拟机工作原理详解.doc

    类加载器负责从硬盘中读取.java源文件,通过Java编译器(javac)将其编译为.class字节码文件。在IDE如Eclipse中,这一编译过程通常是自动完成的。运行Java程序时,JVM的类加载器会将这些字节码文件加载到内存中的...

    Java中Class对象详解共2页.pdf.zip

    总的来说,"Java中Class对象详解共2页.pdf.zip"这份资料虽然篇幅不长,但将带你走进Java反射的世界,深入理解Class对象的使用和反射机制的工作原理。通过学习,你将能够灵活地操控类,提高代码的可扩展性和适应性。...

    Java中多线原理详解.doc

    ### Java中多线程原理详解 #### 一、线程与进程的概念 现代操作系统支持多任务处理,其中多线程是一种实现多任务的有效方式。进程是程序在一个动态环境下的执行实例,代表了一个内存中运行的应用程序。每个进程...

    ClassFinal是一款java class文件安全加密工具

    ClassFinal的工作原理可能包括以下几点:首先,它会对输入的`.class`文件进行读取,然后通过特定的加密算法对字节码进行变换,使得原始的指令序列变得难以理解。加密后的字节码在Java虚拟机(JVM)加载时,需要经过...

    运行java的class文件方法详解.docx

    Java Class 文件运行方法详解 在 Java 开发中,运行 Class 文件是非常重要的一步骤。下面将详细介绍运行 Java 的 Class 文件方法的相关知识点。 一、运行 Class 文件 要运行 Class 文件,需要使用 Java 命令,...

    Java Class文件格式详解1

    Java Class文件是Java虚拟机(JVM)运行的基础,它是编译后Java源代码的二进制表示形式。在深入讲解Class文件格式之前,我们需要理解Java字节码...理解和掌握Class文件格式对于深入理解Java虚拟机的工作原理至关重要。

    Java动态代理语法Proxy类原理详解

    Java动态代理语法Proxy类原理详解是Java语言中的一种非常重要的语法机制,它可以动态地生成代理对象,从而对目标对象进行增强和修改。本文将详细介绍Java动态代理语法Proxy类原理的实现机制和示例代码。 一、Proxy...

    Java_ClassLoader详解

    本文详细介绍了 Java 中的类加载器及其工作原理,包括类加载器的不同类型、类的加载过程以及类加载器与类实例化的关联。深入理解类加载机制对于开发高质量的 Java 应用程序至关重要,特别是在处理多层架构、模块化...

    java的Lock锁原理详解.docx

    Java中的锁机制是多线程编程中至关重要的一个概念,用于协调多个线程对共享资源的访问。在Java中,有两种主要的锁机制:synchronized和Lock。它们都是用来实现线程同步,防止数据竞争,确保并发环境下的数据一致性。...

Global site tag (gtag.js) - Google Analytics