stone

java反射机制学习
泛型,反射等属于JAVA等语言的高级特性,最近想看一些源码,无奈不懂这些基本是寸步难行,所以先恶补一些这些东西先。...
扫描右侧二维码阅读全文
22
2016/11

java反射机制学习

泛型,反射等属于JAVA等语言的高级特性,最近想看一些源码,无奈不懂这些基本是寸步难行,所以先恶补一些这些东西先。

java虚拟机的类加载机制

在java虚拟机中有一个运行时的数据区,这个数据区可以分为三个部分,分别是方法区,栈区和堆区。
其中今天关注的重点就是方法区,方法区主要是放运行时加载的类信息。
当JVM需要加载某个类的时候,会使用ClassLoader去查找相应的class文件,然后加载到JVM中,紧接着提取其中类型信息,加载到方法区中。
其中的类型信息包括类的全限定名,字段信息,方法信息等等。
而这些被加载的类型信息可以通过java的一个基础类Class来进行访问。

java的反射机制

实现反射机制,主要依赖四种类:Class,Constructor,Method,Field,分别对应一个类的构造器,方法和属性,通过访问这些类,我们可以了解类里面的情况。

下面是一个简单的示范:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestFlect {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
        Class PersonClass = Person.class;
        //获得构造器,然后创建一个对象
        Constructor constructor = PersonClass.getDeclaredConstructor(String.class,Integer.class);
        constructor.setAccessible(true);
        Person person = (Person) constructor.newInstance("stone",123);

        //获取一个属性和一个方法
        Class[] classParams = new Class[1];
        classParams[0]=String.class;
        Method personMethod = PersonClass.getDeclaredMethod("print",classParams);
        Field personNameField = PersonClass.getDeclaredField("name");
        //设置为public
        personMethod.setAccessible(true);
        personNameField.setAccessible(true);
        personMethod.invoke(person,"Hello,"+personNameField.get(person));
    }

}


class Person{
    private String name;
    private Integer age;

    private Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    private void print(String text){
        System.out.println(text);
    }
}

反射机制的用途

众所周知,java和scala为静态语言,一般来说是很难在运行的时候改变自己已经编译好的行为,而动态语言就具有这种能力,如下面代码:

var username = $("#username").val
var test = "console.log('"+username+"')"
eval(test)

这个代码没什么实际意义,只是一个示范,那BB了这么久,反射的常用场景是什么呢?作为一个Web开发者,最常见的就是ORM数据库的自动对应特性,
我们只需定义一个和数据库表对应的对象,就可以自动实现数据库的增删查改,大家都知道这个底层实现就是基于JDBC,通过JAVA的反射机制,就可以自动生成对应的sql语句,
从而实现自动完成这些底层的操作。另一个常见的场景就是JSON对象自动生成操作,通过反射机制,可以自动更具属性和值生成对应的键值对。
可以说反射是很多框架的基础,通过反射,可以大大增强了代码可扩展性。

Last modification:September 7th, 2018 at 08:23 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment