java反射原理是什么?java反射机制原理详解

前面给大家介绍了一下什么是java反射机制,那么下面要给大家介绍的就是java反射机制的原理,那么它的原理究竟是怎样的呢?下面就通过下面来做一下详细的了解吧。

首先我们再来介绍一下java反射机制。

java反射机制就是java程序在运行的时候动态的创建类并调用类的方法以及属性。

下面就来介绍一下原理。

一、java反射机制原理

下面是我们经常可以见到的反射例子:

Class
<?> clz = Class.forName("java.util.ArrayList");
ArrayList object = (ArrayList) clz.newInstance();
Method method = clz.getMethod("add",Object.class);
method.invoke(list , "sss");

来分析一下:

前面的2行实现了类的装载、链接、初始化。

后面的2行实现了从class对象当中,获取对象,之后执行反射调用。

这里的话让我们来设想一下,如果,要实现Invoke方法,那么是不是只要实现下面的类就可以了呢?

public class Method
{
    public void invoke(Object obj, Object...args)
    {
        ArrayList list = (ArrayList) obj;
        list.add(args);
    }
}

反射的原理之一就是动态的生成类似上面的字节码,加载到jvm当中运行。

再一起来看看Method对象流程。

上面的Class对象是在加载类的时候,由jvm构造的。

jvm为每一个类管理一个独一无二的Class对象,这个Class对象里维护着这个类的所有

Method、Field、Constructor的cache,这份cache可以被叫做是根对象,每一次,getMethod获取到的Method对象都持有对根对象的引用。

由于一些重量级的Method的成员变量,大多数都不希望每次在创建Method对象的时候,都要重新进初始化,所以,所有代表同一个方法的Method对象都共享着根对象的MethodAccessor,每一次创建都会调用根对象的copy方法复制一份。

Method copy()
{
    Method res = new Method(clazz, name, parameterTypes, returnType
        , exceptionTypes, modifiers, slot, signature
        , annotations, parameterAnnotations, annotationDefault);
    res.root = this;
    res.methodAccessor = methodAccessor;
    return res;
}

调用invoke方法流程

首先的话,method.invoke方法会获取一个MethodAccessor。

会先从Method的根对象当中获取MethodAccessor。

假如是空,那么用reflectionFactory.newMethodAccessor返回DelegatingMethodAccessorImpl实例。

之后再把MethodAccessor赋值给Method的root对象当中,之后调用DelegatingMethodAccessorImpl当中的invoke方法。

在调用invoke的次数大于15次之后,MethodAccessor将由java代码生成。

关于java反射机制原理就给你介绍到这里了,更多java反射机制常见问题,可以继续关注本站来了解。

推荐阅读:

什么是java反射?java反射机制详解