黑马程序员--03.反射--02【Class类对象】【Class对象的获取方式】

反射----2

      Class类对象    Class对象的获取方式

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1.    Class类对象

1). Class类描述的事物

(1). Class类描述的事物

[1]. Java对字节码文件(.class) 进行了抽象,用Class来描述字节码文件

[2]. 学习反射的核心:就是获取字节码文件中的内容

2). Class类对象的作用

Class类可以获取字节码文件中的所有信息

[1].反射依靠的元素Class类【Class类可以获取字节码文件中的所有信息】

[2]. 想要对一个类文件解剖只要获取到该类的字节码文件对象,即Class对象即可。

[3]. Class类的源码声明:

public final class Class<T>{…}

【注意】

{1}. Class类是一个泛型类类型参数T表示某个Class对象所属哪一个类

{2}. final修饰Class类,说明Class类不能被继承。

[4]. Class类不能new对象。Class clazz =newClass();是绝对错误的!!!!

3). 获取Class类对象的三种途径

 实体类代码:

public class Person {
    private int age;
    private String name;
   
    public Person(String name, int age){
       super();
       this.age =age;
       this.name =name;
       System.out.println("Person param run..."+ this.name+":" + this.age);
    }
 
    public Person(){
       System.out.println("Person run...");
    }
}

(1). 非静态方法:getClass()

[1]. 通过ObjectgetClass()方法来获取Class类对象

【示例代码】

//Way1. 根据一个类的具体对象获取Class类对象
public static void getClassObject_1(){
    Personp =new Person();
    Classclazz =p.getClass();
    Personp1 =new Person();
    Classclazz1 =p1.getClass();
    sop(clazz== clazz1);
}

打印结果:


[2]. sop(clazz == clazz1);打印结果true说明:一个类无论有多少个对象,他们的Class对象同一个,也就是对应同一份字节码文件

[3]. 缺点:getClass获取Class类对象的需要明确具体的类并建立相应的对象。这种方式十分麻烦。

(2). 静态属性:class

[1]. 通过任意数据类型的一个静态属性class”来获取Class类对象

【示例代码】

//Way2. 根据一个类的静态属性class来获取Class对象
public static void getClassObject_2(){
    Classclazz =Person.class;
    Classclazz1 =Person.class;
    sop(clazz==clazz1);
}

打印结果:true

[2]. 缺点:相对简单,但是还是要类中的静态成员,扩展性差

(3). 静态方法:Class.forName()

[1]. 通过Class类forName() + 某个类的类名来获取Class类对象

【示例代码】

//Way3. 采用Class的静态方法forName获取这个类的Class对象
public static void getClassObject_3(){
    try{
       //一定要给出这个类的全名:包名 +类名
       Classclazz =Class.forName("cn.itcast.bean.Person");
       sop(clazz);
    }catch(ClassNotFoundException e){
       sop(e.toString());
    }
}

打印结果:class cn.itcast.bean.Person

[2]. 优点仅仅需要字符串形式给出的类的全名即可获取这个类的Class对象,这种方式最为常用,最为方便

[3]. 面试:forName()方法的作用是什么?

{1}. forName( )作用:是返回某个类的字节码文件对象,也就是Class对象

{2}. forName( )返回字节码文件的两种方式

{2}1. 如果这份字节码文件已经被加载,此时forName()直接返回

{2}2. 如果JVM 没有找到要加载的字节码文件,那么JVM就 指示类加载器加载该字节码文件。JVM将加载完的字节码放到自己的缓存中,再返回。

4). Class对象的常用方法

(1). 判断指定的Class对象是否表示一个基本类型

public native boolean isPrimitive(); ---- 本地化方法

(2). 判断指定的Class对象是否表示一个数组类

public native boolean isArray();   ---- 本地化方法

【举例】

System.out.println(int[].class.isPrimitive()); //打印false
System.out.println(int[].class.isArray());      //打印true

(3). 获取Class对象表示的基本信息

[1]. 原型:public String getName();

[2]. 描述:以String的形式返回此Class对象所表示的实体名称

其中实体包括:接口数组类基本类型void

举例

System.out.println(Integer.class.getName()); 

打印结果:java.lang.Integer

2.    Java预定义Class实例对象

(1). 前八种预定义Class实例对象

[1].八种基本数据类对应八个Class实例对象

byte.class,short.class,int.class,long.class,char.class,boolean.class,float.class,double.class

[2]. 基本数据类型的Class实例对象其对应的包装类的Class实例对象

{1}. 基本数据类型的Class实例对象并不是对应包装类对象的Class对象,两者不是一回事

【举例】

System.out.println(int.class == Integer.class); //打印false

{2}. 包装类 封装了基本数据类型Class对象作为其成员全局常量

以Integer类为例:

public static final Class<Integer> TYPE

= (Class<Integer>) Class.getPrimitiveClass("int");

【举例】

System.out.println(Integer.TYPE ==int.class);// 打印true

(2). 第九种预定义的Class实例对象

void类型对应的Class对象是第九种预定义对象:void.class

 【注意】数组也是一种数据类型只要是数据类型,就必须有对应的Class对象

 

-----------  android培训java培训、java学习型技术博客、期待与您交流! ------------



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值