美文网首页
反射原理以及反射的应用

反射原理以及反射的应用

作者: LX_代码制造坊 | 来源:发表于2020-01-07 17:43 被阅读0次

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

    相关文章

      网友评论

          本文标题:反射原理以及反射的应用

          本文链接:https://www.haomeiwen.com/subject/jqzractx.html