如何理解java中的反射机制,为什么利用反射可以写开源框架?

Posted 整理是一切的开始

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解java中的反射机制,为什么利用反射可以写开源框架?相关的知识,希望对你有一定的参考价值。

当诸君在使用idea或者eclipse/vscode等代码编辑器时,有没有想过当你在字符串后面或者一个类实例后输入.的时候

后面跟随出来的字符串方法以及类内方法调用是怎样给出提示的?

The answer is 反射.

反射的具体介绍

  1. 程序可以访问,检测和修改它本身状态或行为的能力,即自描述和自控制.
  2. 可以在运行时加载,探知和使用编译期间完全未知的类.
  3. 给Java插上动态语言特性的翅膀,弥补强类型语言的不足.
  4. java.lang.reflect包,在Java2时代就有,在Java5得到改善.

反射存在的意义

  1. 在运行中分析类的能力
  2. 在运行中查看和操作对象
  • 基于反射自由创建对象
  • 反射构建出无法直接访问的类
  • set或者get到无法访问的成员变量
  • 调用不可访问的方法

   3.实现通用的数组操作代码

   4.类似函数指针的功能

 

首先,创建一个对象有4种方法:

1. new出来

2. clone一个 (类实现Cloneable以备克隆)

3. 序列化读取对象 readObject

4. 反射 newInstance

 

反射还可以调用到类中的成员变量和成员方法

get方法中含有Declared的一般是调用类本身内的以及私有的(变量,方法)

 

在SomeClassC中,这个序列化可以很明白的理解序列化的意义了,不过序列化要在将来的JDK版本被移除.

 

这个类没有什么特殊性,就是一个clone,clone一个对象,两个对象一样,但是内存地址不同.类似复制一个桌面文件,文件内容一样,但是文件名(内存地址)不能重复放到一个磁盘.

 

最有趣的是调用方法,这里可以看到调用本类的f1方法进行输出打印,调用了String类里面的hashCode以及toString方法进行字符串的hashCode计算以及字符串的toString输出.

github

https://github.com/deadzq/reflect-demo



package com.example.annotationdemo;

import com.example.annotationdemo.annotation.MultipleTest;

import java.lang.reflect.Method;

public class MultipleMain {
    public static void main(String[] args) throws Exception{
        int passed = 0, failed = 0;
        String className = "com.example.annotationdemo.MultipleDemo";
        for(Method m:Class.forName(className).getMethods()){
            if(m.isAnnotationPresent(MultipleTest.class)){
                System.out.println(m.getName());
                MultipleTest st = m.getAnnotation(MultipleTest.class);
                try {
                    m.invoke(null,st.a(),st.b());
                    passed++;
                } catch (Throwable e) {
                    System.out.printf("Test %s failed: %s %n",m,e.getCause());
                    failed++;
                }
            }
        }
        System.out.printf("Passed: %d, Failed %d%n",passed,failed);
    }
}

 

以上是关于如何理解java中的反射机制,为什么利用反射可以写开源框架?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的反射该如何使用?

如何利用java的反射机制动态创建对象

浅说Java中的反射机制

如何利用java反射构造一个类,使之实现一个接口和一些功能

Java学习总结(十四)——java反射机制,利用反射动态创建对象

Java讲课笔记36:初探反射机制