今天来说清楚反射到底是什么

反射的实现依赖于java中的Class这个类

Class类是一个类,这么说可能有点拗口,实际上它和HashMap,Integer这些常见的类是同样的东西,"Class"就是这个类的类名

  • Class类的定义

    查看源码可以看到Class这个类的类定义说明,它如果被替换成public final class A<T>,就是定义了A类,这么看就比较好理解Class是类的类名这件事了

    public final class Class<T> implements java.io.Serializable,
                                  GenericDeclaration,
                                  Type,
                                  AnnotatedElement
    
  • Class类的用处

    我们知道Java是一个面向对象的语言,所有的类最终都会继承Object这个对象基类,换句话说在Object基类中定义的public方法在所有类中都可以调用,查看Object源码发现定义了这么一个方法

    public final native Class<?> getClass();

    • public:说明这个是个公开类,所有继承它的子类都可以调用
    • final:说明这个方法被写死了,不能在子类中对它进行重写
    • native:说明这个类调用的是和其他语言交互的接口,具体怎么实现有兴趣可以去查阅相关资料
    • Class<?> 说明调用这个方法的返回值是一个"Class"类型
  • Class类的内容

    Class类中包含一个类的各种信息,下面通过一段程序来分析

    public class Node { //定义了一个类
    	int val;
    	Node next;
    	Node(int x) {
    		this.val = x;
    	}
    }
    
    public static void main(String[] args) throws IOException {
        Node node = new Node(1); //实例化了一个Node类
        Class cl = node.getClass(); //调用node这个实例的getClass()方法,得到一个CLass类型的实例cl
        String className = cl.getName();    
    }
    

    String className = cl.getName();中调用了Class这个类的getName方法,来看这个方法的定义

    public String getName() {
        String name = this.name;
        if (name == null)
            this.name = name = getName0();
        return name;
    }
    

    方法的返回值是一个String类型,也就是类的类名,注意如果这个类是放在某个包中,则返回值是包名.类名的形式

    import java.util.HashMap;
    
    Map<Integer,Integer> map = new HashMap<>();
    Class cl = map.getClass();
    String name = cl.getName(); 
    System.out.println(name);  //打印出的值为java.util.HashMap
    

    如上面代码段,HashMap放在java.util这个包中,则使用getName方法会带上包名

    继续往下看,此时我们一通操作,通过node这个实例化的对象得到了它的类名"Node",那这个类名有什么用呢

  • Class.forName()

    Class类中定义了一个forName方法,能够通过类名来获得一个Class类的实例

    public static void main(String[] args) throws ClassNotFoundException {
        Node node = new Node(1); //实例化了一个Node类
    	Class cl = node.getClass(); //调用node这个实例的getClass()方法,得到一个CLass类型的实例cl
    	String className = cl.getName();  
    	Class cl2 = Class.forName(className); //此时cl == cl2的判断结果为true
    }
    

    注意到这个加了一个throws ClassNotFoundException,原因是如果forName(className)中的className不是一个有效的类名,需要抛出一个错误

到此为止,我们知道通过Class这个类可以做到以下操作

  • 通过一个类的实例来得到类名
  • 通过类名来获取它对应的Class对象

其实这就是反射的基本原理了,至于反射具体有什么用,后续单独写个新的博客再讲

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值