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. Mysql慢查询操作梳理

    Mysql慢查询解释MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询 ...

  2. C语言--指向多维数组的指针和指针数组

    #include <stdio.h> //void show(char *p[]); ]); int main(){ ][]={","abc","x ...

  3. 傅盛:如何快慢“炼”金山?(转)

    原文地址:http://www.huxiu.com/article/16052/1.html 一直以来,金山都不是一家"大公司",从前不是,现在也不是. 能够掰着指头数完腾讯六大事 ...

  4. 数据库 SQL语法二

    聚合函数 -SUM([DISTINCT] FIELDNAME) 求指定列之和,[DISTINCT]选项表示剔除重复记录 例如:SELECT SUM(age) FROM TABLE1; SELECT S ...

  5. Memcached的安装和使用以及nginx整合memcached

    一.模块的安装启动 wget http://cdnetworks-kr-2.d1.sourceforge.net/project/levent/libevent/libevent-2.0/libeve ...

  6. Entity Framework 出现 "此 ObjectContext 实例已释放,不可再用于需要连接的操作" 的错误

    原因 Entity的导航属性在View中使用,但是该Entity所在的Context已经在Controller中通过 using 释放掉:但是Entity又具有Deferred Query Evalu ...

  7. C# has three timers

    结论 *1.窗体timer和线程timer.计时器timer不同,因为后两者dispose之后,GC可以收集,而前者无法收集 *2.如果一个对象的成员函数正在被执行,那么这个对象肯定不会被收集 *3. ...

  8. ipython又一方便的调试和应用工具!!!

    控制台下://ipython 命令丰富 比如:ls 显示目录  ipython --pylab %run -p *.py quit关闭     示例: In []: %run -p test.py H ...

  9. 屠龙之路_战胜View&对DataBase猛烈进攻_ThirdDay

    避开狮身人面兽攻击的屠龙战士继续前行.突然眼见一黑,战士们进到迷宫里,机智的战士用一根羊毛线绑在迷宫入口处,少年们手握着羊毛线,在迷宫里继续前行.在那样一个拐角处,遇到了恶龙的手下View&D ...

  10. Beta版本冲刺———第三天

    会议照片: 项目燃尽图: 1.项目进展: 今天解决的进度:对游戏结束的检测进行了完善,使分数标签和最高分标签的变化更加合理. 仍在进行对排行榜分数变更的实现 2.每个人每天做的事情 郭怡锋:汇总工作进 ...