Java学习笔记-反射与Class类

1.反射与Class类

Java反射机制指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个属性和方法。这种动态获取信息以及动态调用对象的方法的功能称之为Java语言的反射机制。
在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的**类型标识。**这个信息跟踪着每个对象所属的类。可以通过专门的Java类访问这些信息。保存这些信息的类被称为Class。
请注意,一个Class对象实际上表示的是一个类型,而这个类型未必一定是一种类。例如,int并不是一种类,但是int.Class确是一个Class对象。

3.getClass()方法

对象中的getClass方法会返回一个Class类对象

API:

Class Object.getClass()

下面,我们举一个简单的例子:

	Employee e=new Employee("A",5000);
	Employee r=new Manager("B",8000);
	Class cl1=e.getClass();
	Class cl2=r.getClass();
	System.out.println(cl1.getName()+"   "+e.getName());
	System.out.println(cl2.getName()+"   "+r.getName());

程序会返回:

inheritace.Employee Wang
inheritace.Manager Liu

(inheritace表示类Employee与Manager是包inheritace中的类,其中Employee是Manager的超类)

4.T.class

当然,还有一些其他的获得Class类对象的方法,T是任意的Java类,T.class将代表匹配的类对象
例如:

	Employee e=new Employee("A",5000);
	Employee r=new Manager("B",8000);
	Class cl1=Employee.class;
	Class cl2=Manager.class;
	System.out.println(cl1.getName()+"   "+e.getName());
	System.out.println(cl2.getName()+"   "+r.getName());

程序会返回:

inheritace.Employee Wang
inheritace.Manager Liu

5.Class.forName()

我们也可以**使用静态方法Class.forName()**获得类名对应的Class类对象。

    Employee e=new Employee("A",5000);
    Employee r=new Manager("B",8000);
    Class cl1 = Class.forName("inheritance.Employee");
    Class cl2 = Class.forName("inheritance.Manager");
    System.out.println(cl1.getName()+"   "+e.getName());
    System.out.println(cl2.getName()+"   "+r.getName());

程序会返回:

    inheritace.Employee Wang
    inheritace.Manager Liu

6.Class类对象的常用方法

1.getName():
一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

2.newInstance():
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。

3.getClassLoader()
返回该类的类加载器。

4.getComponentType()
返回数组Class类组成元素的类型,如果这个类并不代表一个数组类,此方法返回null。

5.getSuperClass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

6.isArray()
判定此 Class 对象是否表示一个数组类。

7.Class类对象的一些使用技巧

1.forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。

Object obj = Class.forName(name).newInstance();

2.虚拟机为每种类型管理一个独一无二的Class对象
Java中的同一类的Class对象有几个取决于加载该类的类加载器,理论上同一类被不同的类加载器加载所产生的Class对象都不同。实际中,一般情况下,同一工程下不会出现同一类多个Class对象的情况
我们看下面的例子:

Employee e=new Employee("A",5000);
Employee r=new Manager("B",8000);
Employee t=new Employee("C",5000);
Class cl1=e.getClass();
Class cl2=r.getClass();
Class cl3=t.getClass();
System.out.println(cl1==Employee.class);
System.out.println(cl3==Employee.class);
		
System.out.println(cl1.equals(Employee.class));
System.out.println(cl3.equals(Employee.class));
		
System.out.println(cl1==cl3);
System.out.println(cl1.equals(cl3));

System.out.println(cl1.getName());
System.out.println(cl3.getName());

返回结果是:

true
true
true
true
true
true
inheritance.Employee
inheritance.Employee

这就说明了,同一个类的不同对象只能产生一个Class对象,无论是cl1还是cl3其引用都是相同的,都指向这个唯一的Class对象。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值