反射原理以及反射的应用

2020-01-07  本文已影响0人  LX_代码制造坊

网上关于反射原理的有很多,首先讲一下反射的定义。
定义:在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

既然是针对运行状态的类,知道其所有属性和方法,那么我们就要知道类里面有什么?

类中包含:成员变量、构造方法、成员方法

我们学习反射就得知道我们为什么学习反射?学习反射有什么好处?

如果我们要调用一个类,原来最基本的方法是new 一个对象,将类实力化,然后在调用它的属性和方法。那么,如果我们需要在这个地方调用其他的类,就必须再重新new一下其他的类。如果我们的项目比较大的话,改动一下类就必须重启服务,是一件很麻烦的事情。
如果我们学习了反射,那么我们就可以动态的,不需要改动已经写好的class文件,就可以运行新的对象。

话不多说,关于反射获取class类的方式有三种:

1、Class.forName("对象地址")
2、对象.class
3、new 对象.getClass()

获取类中的属性、构造方法、成员方法

1、属性
Field field[] = a.getFields(); //获取所有public权限的属性
Field field = a.getField();
Field field[] = a.getDeclaredFields(); //获取所有属性,不管什么权限
Field field = a.getDeclaredField();
如果我们想对私有属性进行操作,则需要忽略安全访问权限
field.setAccessible(true);
2、构造方法
Constructor c[] = a.getConstructors(); //获取所有public构造方法
Constructor c = a.getConstructor();
Constructor c[] = a.getDeclaredConstructors(); //获取所有权限的构造方法
Constructor c = a.getDeclaredConstructor();
忽略安全访问权限
c.setAccessible(true);
3、成员方法
Method method = a.getMethod("方法名称"); //获取指定方法
Method method[] = a.getMethods(); //获取所有public成员方法
Method method[] = a.getDeclaredMethods(); //获取所有权限的成员方法
忽略安全访问权限
method.setAccessible(true);

案例

反射的应用,通过配置文件实现对程序加载类的控制。反射机制对于框架的使用尤为重要。
首先新建一个配置文件:pro.properties ,其中添加配置,比如类名、方法
className=test2.Person
methodName=eat
在调用的文件中,

public class TestFS {
    public static void main(String[] args) throws Exception {
        //1、加载配置文件
        Properties properties = new Properties();
        ClassLoader classLoader = TestFS.class.getClassLoader();
        InputStream resourceAsStream = classLoader.getResourceAsStream("pro.properties");
        properties.load(resourceAsStream);
        //2、获取类中定义的数据
        String className = properties.getProperty("className");
        String methodName = properties.getProperty("methodName");
        //3、将类加载进内存
        Class aClass = Class.forName(className);
        //4、创建对象
        Object o = aClass.newInstance();
        //5、获取方法对象
        Method method = aClass.getMethod(methodName);
        //6、执行
        method.invoke(o);

    }
}
上一篇下一篇

猜你喜欢

热点阅读