我是靠谱客的博主 儒雅黄豆,最近开发中收集的这篇文章主要介绍今天来说清楚反射到底是什么,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

反射的实现依赖于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对象

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

最后

以上就是儒雅黄豆为你收集整理的今天来说清楚反射到底是什么的全部内容,希望文章能够帮你解决今天来说清楚反射到底是什么所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部