Java中的Class类说明及用法

Class类的定义

Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个类的父类。Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。 比如:每个数组均属于一个 Class 类对象,所有具有相同元素类型和维数的数组共享一个Class 对象。基本的 Java 类型(boolean, byte, char, short,int, long, float 和 double) 和 void 类型也可表示为 Class 对象。

简而言之:
1、Class也是类的一种。
2、Class类对象的内容是对应封装了你所创建的类的信息,比如创建一个Person类,那么Java会生成一个内容是Person的Class对象。
3、同一个类的对象在内存中都由唯一的一个不变的Class对象相对应,即Class对象是类在内存中的代理。
4、Class对象不能以 new 类名() 的方式创建,只能由系统创建。
5、Class类的作用是封装某个对象的类型信息,你可以通过它来提供或者获得目标对象的信息。

获得Class对象

方法一:类名.class

class obj = String.class;

注意:使用这种办法生成Class类对象时,不会使JVM自动加载该类。而其他办法会使得JVM初始化该类。

方法二: Class类的forName函数

public class Person{};
Class obj = Class.forName("Person");

注意:此方法forName括号内必须为类的全路径名.

方法三:使用对象的getClass函数

public class Person {};
Person person = new Person();
//获得person的Class对象
Class obj = person.getClass(); 
//获得person父类的Class对象(继承情况)
Class obj1 = person.getSuperclass();

Class 的常用方法

newInstance()函数
创建此 Class 对象所表示的类的一个新实例。此方法传播 null 构造方法所抛出的任何异常,包括已检查的异常。使用此方法可以有效地绕过编译时的异常检查.

public class Person{};
Class obj = Class.forName("Person");
Object newPerson = obj.newInstance();

注意:此处生成的是Object类的实例,并非Person类的实例.

类型失真的解决方法:
使用转型或者使用泛化的Class生成带类型的实例.

public class Person{};
Class<Person> obj = Class.forName("Person");
Person newPerson = obj.newInstance();

缺点:使用泛化Class语法的对象引用不能指向别的类.

扩展:使泛化Class语法构造此类对象的父类对象时要用特殊方法

public class Person{};
class students extends Person{};
Class<students> obj = student.class;
Class<? super students> = student.getSuperClass();

getConstructor() 函数
返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。

pulic class Person{};
Class<Person> obj = person.class;
Constructor<Person> con = obj.getConstructor();

getField() 函数
返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的全部 public成员字段,包括父类.。

获得其他权限的成员字段方法
字段名.setAccessable()
当括号内参数为true时,可以取消Java语言访问检查,即非Public权限字段也可访问.

getDeclaredField() 函数
和getfield的区别在于它可以获得本类或本接口任何权限的成员字段.


getMethod() 函数
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的全部public成员方法,包括父类.

获得其他权限的成员方法
字段名.setAccessable()
当括号内参数为true时,可以取消Java语言访问检查,即非Public权限字段也可访问.

getDeclareMethod()函数
返回一个 Method 对象,该对象反映此 Class 对象所表示本类或本接口全部public方法。


getGenericSuperclass() 函数
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的直接超类的 Type.

父类泛型的类型探测

public student extends Person<student> {}
Sutdent student = new Student();
Class obj = student.class;
//获得父类type
Type type = obj.getGnericSuperclass();
// 参数化类型,即泛型
ParameterizeType p = (ParameterizeType) type;
//获得参数化类型数组
Type arr[] = p.getActualTypeArguments();
//获得父类泛型的类型
Class c = (Class)arr[0];

综上所述

Class<T> entityClass = (Class<T>)((ParameterizeType)getClass().getGnericSuperclass()).getActualTypeArguments()[0];

getName() 函数
以String形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。


全文完

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值