简友广场Android开发

Java | 反射:在运行时访问类型信息(含 Kotlin)

2020-08-23  本文已影响0人  彭旭锐

前言

延伸文章


目录

1. 类型系统的基本概念

首先,梳理一一下类型系统的基础概念:

public class MyRunnable {
    public abstract void run();
}

// 编译错误:Incompatible types
java.lang.Runnable runnable = new MyRunnable() { 
    @Override
    public void run() {
        
    }
}
runnable.run(); // X

相对地,JavaScript 是弱类型语言,一个变量没有固定的类型,允许接收不同类型的值:

function MyRunnable(){
    this.run = function(){
    }
}
function Runnable(){
    this.run = function(){
    }
}
var ss = new MyRunnable();
ss.run(); // 只要对象有相同方法签名的方法即可
ss = new Runnable();
ss.run();

更具体地描述,Java的强类型特性体现为:变量仅允许接收相同类型或子类型的值。嗯(黑人问号脸)?和你的理解一致吗?请看下面代码,哪一行是有问题的:

注意,请读者假设 1 ~ 4 号代码是单独运行的

long numL = 1L;
int numI = 0;
numL = numI; // 1
numI = (int)numL; // 2

Integer integer = new Integer(0);
Object obj = new Object();
integer = (Integer) obj; // 3 ClassCastException
obj = integer; // 4

用一张图概括一下:


2. 反射的基本概念


3. 反射调用的实现

Editting...


4. 反射的应用场景

4.1 类型判断

4.2 创建对象 & 数组

4.3 访问字段、方法

Editting...

4.4 获取泛型信息

我们知道,编译期会进行类型擦除,Code 属性中的类型信息会被擦除,但是在类常量池属性(Signature属性、LocalVariableTypeTable属性)中还保留着泛型信息,因此我们可以通过反射来获取这部分信息。在这篇文章里,我们详细讨论:《Java | 关于泛型能问的都在这里了(含Kotlin)》,请关注!

4.5 获取运行时注解信息

注解是一种添加到声明上的元数据,而RUNTIME注解在类加载后会保存在 Class 对象,可以反射获取。在这篇文章里,我们详细讨论:《Java | 这是一篇全面的注解使用攻略(含 Kotlin)》,请关注!


参考资料

推荐阅读

感谢喜欢!你的点赞是对我最大的鼓励!欢迎关注彭旭锐的简书!

上一篇下一篇

猜你喜欢

热点阅读