Java高级特性——反射

一. 定义及优缺点

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高级特性——反射)