1.Class对象 VS. 实例对象

在Java中我们一般是这样使用类的:编写类,然后new对象,再调用方法。这里new出来的对象暂且称之为实例对象(instance)。其实在这之前还涉及到一个Class对象。这个Class对象就是用来创建类的所有实例对象的。

每个类都有一个Class对象Class对象是由JVM帮我们自动生成的。每当编写并且编译了一个新类,就会产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中)。为了生成这个类的实例对象,运行这个程序的的Java虚拟机会使用被称为“类加载器”的子系统。所有类都是在对其第一次使用时,动态加载到JVM中的。类加载器会首先检查这个类的Class对象是否已经加载。若尚未加载,默认的类加载器就会根据类名查找.class文件。一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有实例对象

所有的Class对象都是java.lang.Class<T>类的实例对象

2.为了使用一个类而做的准备工作

1.加载:这是由类加载器执行的。该步骤将查找字节码,并从这些字节码中创建一个Class对象

2.链接:在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用。

3.初始化:如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块。

初始化被延迟到了对静态方法(构造器隐式地是静态的)首次引用或者对非常数静态域进行首次引用时才执行。

3.三种方法获得一个类的Class对象的引用

(1)通过java.lang.Class类的静态方法forName()

(2)调用实例对象的getClass()方法

(3)类字面常量方式(比如MyClass.class)

package com.example;

class MyClass{}

public class ClassTest {

    public static void main(String[] args) {

        System.out.println("第一种方式...");
Class c1 = null;
try {
c1 = Class.forName("com.example.MyClass"); //注意,参数是包名+类型
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
System.out.println(c1.getName()); //输出:com.example.MyClass
System.out.println(c1.getCanonicalName()); //输出:com.example.MyClass
System.out.println(c1.getSimpleName()); //输出:MyClass System.out.println("第二种方式...");
Object instance = new MyClass();
Class c2 = instance.getClass();
System.out.println(c2.getName()); //输出:com.example.MyClass System.out.println("第三种方式...");
Class c3 = MyClass.class;
System.out.println(c3.getName()); //输出:com.example.MyClass
} }

4.泛化的Class引用

(1)Class引用总是指向某个Class对象。在声明Class引用的时候最好指定泛型。如果不能确定具体的类型,Class<?>也是优于平凡的Class的,即便它们是等价的。

(2)为了创建一个Class引用,并且它被限定为某种类型,或者该类型的任何子类型,可以将通配符与extends关键字结合,创建一个范围。如下:

Class<? extends Number> bound = int.class;

注意:虽然Integer继承自Number,但是Integer类的Class对象和Number类的Class对象并没有半毛钱的继承关系。(也就是说Integer类的Class对象并不是Number类的Class对象的子类)

(3)还可以声明某个Class引用,它被限定为某种类型,并且是该类型的超类,可以这样:

package com.example;

class BaseClass{}

class ChildClass extends BaseClass{}

public class ClassTest {

    public static void main(String[] args) {

        Class<ChildClass> childClass = ChildClass.class;
Class<? super ChildClass> superClazz = childClass.getSuperclass();
System.out.println(superClazz.getName()); //输出:com.example.BaseClass
} }

Java反射的一些理解的更多相关文章

  1. JAVA反射机制及理解

    JAVA反射 往往当我们面对一项新的知识时,我们往往需要知道三个方面,它是什么,它能做什么,它比原有知识强在哪里,我们该怎么使用它.当你能够解决这些问题时,便意味着你已经对这项知识入门了. 首先: 反 ...

  2. Java反射的浅显理解

    一.回顾反射相关的知识 1.在xml文件中使用反射的好处: 1)代码更加灵活,后期维护只需要修改配置文件即可 · 初学者一般习惯于在代码本身上直接修改,后期也可以修改配置文件达到相同的目的 · 修改配 ...

  3. 我对java反射机制的理解

    我们平常怎么用一个使用类,怎么使用类的方法?其实就是创建一个对象,并且通过这个对象调用这个方法.不过这有一个问题,就是这个对象的载体就和这个对象产生了耦合,怎么降低两者间的耦合呢?java的反射机制就 ...

  4. java反射机制的理解

    反射机制是什么概念?大多都有介绍,指的是程序在运行状态中,能够加载一个只有类名的类,加载完之后会在堆上产生一个Class对象.通过这个 Class对象可以获得类的属性.方法和其他类信息.之前对反射的应 ...

  5. java反射的初理解

    反射 获取类的方法: Class<?> aClass1 = Class.forName("TestDemo.refection.User");//通过类路径获取 Cla ...

  6. JAVA反射机制_获取字节码文件对象

    是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...

  7. Java反射机制获取Class文件

    JAVA反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为 ...

  8. java反射机制 + Method.invoke解释 getMethod + 反射理解

    功能: 通过读取另一个Dll去创建一个控件(Form,Button,TextBox,DataGridView),然后对当中一些属性进行检查. 创建控件的大致流程是,Assembly->Modul ...

  9. (转)JAVA反射机制理解

    JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...

随机推荐

  1. docker中如何制作自己的基础镜像

    一.本地镜像 举个例子:现在把自己的开发环境打包,取名为centos6-base.tar,然后在docker中,以centos6-base.tar作为基准镜像. 1.创建自己的镜像,放置于/root目 ...

  2. [转]向facebook学习,通过协程实现mysql查询的异步化

    FROM : 通过协程实现mysql查询的异步化 前言 最近学习了赵海平的演讲,了解到facebook的mysql查询可以进行异步化,从而提高性能.由于facebook实现的比较早,他们不得不对php ...

  3. mac系统上使用压缩包版的mysql(非安装版)

    mac本换了块固态硬盘,一切重新装过,mysql嫌官网下载太慢,直接百度 "mysql mac",第一个就是: 不料下载完后,发现这是一个压缩包版,并没有安装程序.网上搜索了一下, ...

  4. mac上开启ftp

    开启 sudo -s launchctl load -w /System/Library/LaunchDaemons/ftp.plist 关闭 sudo -s launchctl unload -w ...

  5. 文本比较算法Ⅱ——Needleman/Wunsch算法

    在"文本比较算法Ⅰ--LD算法"中介绍了基于编辑距离的文本比较算法--LD算法. 本文介绍基于最长公共子串的文本比较算法--Needleman/Wunsch算法. 还是以实例说明: ...

  6. 2013级软件工程GitHub账号信息

    GitHub账号信息 序号 班级 学号 姓名 个人GitHub网址 1 信1301-1班 20122951 刘伟 https://github.com/weige8882 2 信1301-1班 201 ...

  7. PHP 基础笔记

    数据类型 字符串 整数 浮点数 布尔值 数组 对象 NULL 未定义的变量,数据类型为 NULL. PHP 中数组和对象是不同的类型,而 js 中数组即为对象.(ps: es6 已经内置了 class ...

  8. 如何在 ie6 中使用 "localStorage"

    好吧,我只是个标题党,ie6 下根本无法使用跟 h5 沾边的 localStorage.今天要向大家介绍的是 ie 特有的 userData 的存储方式,并且对它进行封装,使得不支持 localSto ...

  9. DOM Document节点类型详解

    在前面 DOM 概况 中,我们知道了 DOM 总共有 12 个节点类型,今天我们就来讲下 DOM 中最重要的节点类型之一的 document 节点类型. 1.概况 Javascript 通过 Docu ...

  10. Windjs应用

    一个异步的js类库,应用价值不大,所以代码也没在维护了.在做h5特效或者游戏动画方面有点用处. $await是Windjs的核心api.具体可以check 浅谈Jscex的$await语义及异步任务模 ...