java中的反射及Class对象常用方法介绍

本文详细介绍了Java中的反射机制,特别是Class对象的常用方法,如isAssignableFrom()、asSubclass()、cast()等,以及Method对象的getDeclaredAnnotations()、getDefaultValue()、invoke()等。反射允许程序在运行时检查类的属性、方法和构造器,实现动态调用和类型转换。此外,还提到了Constructor和Field的相关方法,强调反射在理解和操作Java对象中的重要作用。
摘要由CSDN通过智能技术生成

介绍

有一个有意思的小实验,有一盆水,在盆中放上镜子,放到阳光下,镜子反射到墙面的光变成了彩虹。通过反射,可以知道光是由七种颜色组成的。
java中的反射又叫内省或者自省,简单来说就是知道自己身上有什么东西。我们知道一个类有自己的继承体系,由构造器、方法和字段组成,jdk1.5之后加入了注解。所有这些东西都能通过反射拿到。
Java中跟反射有关的类有:Class、Constructor、Method、Filed。下面介绍这四个类中经常使用的方法。

一、Class对象

Class对象是由java虚拟机创建的,当我们的应用程序需要某个类的时候 ,java虚拟机会加载该类,并创建对用的Class对象。Java中的对象、接口、枚举、注解、基本类型及其数组类型,都会有对应的Class对象。
创建Class对象的方式:

  1. 类名.class方式,例如:Object.class;
  2. Class.forName()方法,例如:Class.forName(“com.xxx.User”);
  3. 对象通过继承自Object的getClass()方法,例如:user.getClass(),每个实例都保存了指向当前类的Class实例的指针

Class常用的方法

1、java.lang.Class#isAssignableFrom(Class)

方法名称直译:是可赋值的从(某个Class对象),表示的是当前Class对象所代表的的类或接口要么是指定的参数的Class对象所代表的类或者接口的子类,要么是相同的类型。作用是通过此方法判断后,可以进行安全的强制类型转换。

//老虎类
public class Tiger {
   
}

//用法,此方法可以接受所有的Class对象
@SuppressWarnings("unchecked")
public void process(Class<?> clazz) {
   
	//进行类型判断
    if (clazz.isAssignableFrom(Tiger.class)) {
   
        processTigerClass((Class<Tiger>) clazz);
    }
    //......
}
//此方法处理Tiger及其子类的Class对象
public void processTigerClass(Class<? extends Tiger> clazz) {
   
    //.......
}
2、java.lang.Class#asSubclass(Class)

方法名称直译:作为子类,意思把当前的Class实例,转成指定的参数Class实例的子类。主要的作用就是窄化类型,传递给方法参数。
例如:

//老虎类
public class Tiger {
   
}

//用法,此方法可以接受所有的Class对象
//@SuppressWarnings("unchecked")
public void process(Class<?> clazz) {
   
    if (clazz.isAssignableFrom(Tiger.class)) {
   
        processTigerClass(clazz.asSubclass(Tiger.class));//进行类型转换
        //当然我们也可以不使用上述方式,参见下方,只不过会产生编译警告,未受检的类型转换
        //在此方法上添加@SuppressWarnings("unchecked")即可
        //processTigerClass((Class<Tiger>) clazz);
    }
    //......
}
//此方法处理Tiger及其子类的Class对象
public void processTigerClass(Class<? extends Tiger> clazz) {
   
    //.......
}

3、java.lang.Class#cast(Object)

方法名直译:转换,把指定的对象转成当前Class对象所代表的类或着接口
例如:


//老虎类
public class Tiger {
   
}
//处理所有的对象
public void processObject(Object object) {
   
	//获取老虎的Class对象
    Class<Tiger> clazz = Tiger.class;
    //进行类型判断
    if (clazz.isAssignableFrom(object.getClass())) {
   
        processTiger(clazz.cast(object));
    }
    //平时开发中用的是另一种形式,更简单,参见下方
    /*
    if (object instanceof Tiger){
        processTiger((Tiger) object);
    }
    */
    //......
}
//只处理老虎对象
public void processTiger(Tiger tiger) {
   
    //......
4、java.lang.Class#forName(String)

方法名直译:对于(什么)的名字,加载由字符串所指定全限定名类的Class对象。还有一个重载的方法,java.lang.Class#forName(String, boolean,ClassLoader)
解释下重载方法的参数:

  1. 类的全限定名
  2. 是否初始化,是否执行static代码块以及静态变量的赋值
  3. 类加载器,指定当前对象由那个类加载器加载
//user对象
public class User {
   
	//由public static final 修饰的字段称为编译时期常量,在使用时不会触发类的加载
    public static final String name= "zs";
    
    static {
   
        System.out.println("user");
    }
    
    private static  int a = getA();

    private static int 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值