美文网首页
Java高级特性——反射

Java高级特性——反射

作者: squirrels | 来源:发表于2020-04-16 11:30 被阅读0次

    一. 定义及优缺点

    JAVA反射机制:是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

    • 优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
    • 缺点:对性能有影响,这类操作总是慢于直接执行java代码。

    二. 说说反射的用途,及你遇见的哪里用到了反射

    在日常的第三方应用开发过程中,经常会遇到某个类的某个成员变量、方法或是属性是私有的或是只对系统应用开放,这时候就可以利用Java的反射机制通过反射来获取所需的私有成员或是方法。例如:

    • JDBC中,利用反射动态加载了数据库驱动程序。
    • Web服务器中利用反射调用了Sevlet的服务方法。
    • Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
    • 很多框架都用到反射机制,注入属性,调用方法,如Spring。

    动态代理是什么?有哪些应用?怎么实现动态代理?

    动态代理是运行时动态生成代理类。
    动态代理的应用有SpringAOP数据查询、测试框架的后端mock、rpc,Java注解对象获取等。
    JDK原生动态代理和cglib动态代理。
    JDK原生动态代理是基于接口实现的,而cglib是基于继承当前类的子类实现的

    三.Java反射机制的作用

    • 在运行时判断任意一个对象所属的类
    • 在运行时构造任意一个类的对象
    • 在运行时判断任意一个类所具有的成员变量和方法
    • 在运行时调用任意一个对象的方法

    四. 反射的使用

    1. 三种方式获取Class对象

    (1) Class类的forName静态方法

        public static void main(String[] args) {
            // 1. Class类的forName静态方法获取Class对象
            try {
                Class<?> cls = Class.forName("com.zss.study.Coder");
                System.out.printf(cls.toString());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    

    (2) 直接获取某一个类的class对象

        public static void main(String[] args) {
            System.out.println(Coder.class.toString());
        }
    

    (3) 调用某个对象的getClass()

        public static void main(String[] args) {
            Coder coder = new Coder();
            System.out.println(coder.getClass().toString());
        }
    

    类名.class和对象.getClass()几乎没有区别,因为一个类被类加载器加载后,就是唯一的一个类对象。

    相关文章

      网友评论

          本文标题:Java高级特性——反射

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