Java高级编程

反射机制

2019-07-31  本文已影响4人  江湖非良人

反射机制简介 ObjectClass

  在Java语言中之所以会员如此众多的开源技术支撑,很大一部分是来自于Java的最大的特征:反射机制,也是Java的精髓。所有技术实现的目标只有一点:可复用性(可重用性)。
  对于反射技术首先考虑的是“反”与“正”的操作,所谓的“正”操作指的是使用一个类时,一定要先导入程序所在的包,而后根据类进行对象的实例化,并依靠对象调用类中的方法。而“反”则是根据实例化对象反推出其类型。
范例:正向操作

import java.util.Date;//1、导入程序所在的包.类,就知道对象的来源了
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Date date=new Date();//2、通过类产生实例化对象
        System.out.println(date.getTime());//3、根据对象调用类中的方法
    }
}

  如果要想实现反的操作,那么首先要采用的就是Object类中所提供的一个方法:

import java.util.Date;//1、导入程序所在的包.类,就知道对象的来源了
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Date date=new Date();//2、通过类产生实例化对象
        System.out.println(date.getClass());//3、根据实例化对象找到对象的所属类型
        //class java.util.Date
    }
}

  getClass()可以帮助使用者找到对象的根源。

Class类对象的三种实例化模式

  反射中所有的核心操作都是通过Class类对象展开的,可以说Class类是反射操作的根源所在,但是这个类如果要想获取它的实例化对象可以采用三种方式来实现,首先来观察java.lang.Class类的定义:

public final class Class<T> extends Object implements Serializable, GenericDeclaration, Type, AnnotatedElement

  从JDK1.5开始,Class类在定义的时可以使用泛型进行标记,这样的用法主要是希望可以避免所谓的向下转型。下面通过具体的操作讲解三种实例化形式。
1、【Object类支持】Object类可以根据实例化对象获取Class对象。
    public final Class<?> getClass()

class Person{//采用自定义的程序类
}
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Person per=new Person();
        Class<? extends Person> cls=per.getClass();
        System.out.println(cls.getName());//类的完整名称
    }
}

  特点:如果想获得Class类对象,就必须产生指定类对象后才可以获得。

2、【JVM直接支持】采用“类.class”的形式实例化

class Person{//采用自定义的程序类
}
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Class<? extends Person> cls=Person.class;
        System.out.println(cls.getName());//com.mldn.demo.Person
    }
}

  特点:如果想获得Class类对象,就必须导入程序对应的开发包;

3、【Class类支持】在Class类中提供有一个static加载类的方法:
    public static Class<?> forName​(String className)throws ClassNotFoundException

package com.mldn.demo.ref;
public class Person {
}
package com.mldn.demo;
public class JavaApiDemo {
    public static void main(String[] args) throws Exception {
        Class<?> cls=Class.forName("com.mldn.demo.ref.Person");//该类必须存在
        System.out.println(cls.getName());//com.mldn.demo.ref.Person
    }
}

  特点:可以直接采用字符串的形式定义要使用的类型,并且程序中不需要编写任何的import语句。

上一篇 下一篇

猜你喜欢

热点阅读