进阶Java编程(7)反射机制

反射机制

1,反射机制简介

  在Java语言里面之所以会有如此多的开源技术支撑,很大的一部分是来自于Java最大的特征【反射机制】。如果你不能够使用反射机制去进行项目的开发与设计,那么可以说你并未接触到Java的精髓。

  所有技术实现的目标只有一点【重用性】

  对于反射技术首先来考虑的是“反”与“正”的操作,所谓的“正”的操作是

  当我们要使用一个类的时候,一定要先导入程序所在的包,而后根据类进行对象的实例化并且调用类中的方法。但是如果说“反”,根据实例化对象反推出其类型。

  ·范例:正向操作

 1 /**
 2  * 正向操作的一般流程
 3  */
 4 package cn.mufasa.demo;
 5 import java.util.Date;//①先导入程序所在的包,知道对象的出处
 6 public class JavaAPIDemo1 {
 7     public static void main(String[] args) {
 8         Date date=new Date();//②通过类产生实例化对象
 9         System.out.println(date.getTime());//③根据对象调用类中的方法
10     }
11 }

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

  获取类信息——>public final Class<?> getClass();

  ·范例:观察Class对象的使用

1 package cn.mufasa.demo;
2 import java.util.Date;
3 public class JavaAPIDemo2 {
4     public static void main(String[] args) {
5         Date date=new Date();
6         System.out.println(date.getClass());//根据实例化对象找到对象类型
7     }
8 }

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

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

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

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

  在JDK1.5开始Class类在定义的时候可以使用泛型进行标记,这样的用法主要是希望可以避免所谓的向下转型。下面通过具体的操作讲解三种实例化形式。

  ①【Object类支持】Object类可以根据实例化对象获取Class对象:public final Class<?> getClass()

  这种方式有一个不是缺点的缺点???:如果现在只是想要获得Class类对象,则必须产生指定类对象后才可以获得;会造成无用的对象产生::备注下面代码需要额外创建一个Person类

 1 package cn.mufasa.demo;
 2 public class JavaAPIDemo3 {
 3     public static void main(String[] args) {
 4         Person per=new Person();//已经存在指定类的实例化对象
 5         Class<? extends Person> cls=per.getClass();
 6         System.out.println(cls);
 7         System.out.println(cls.getName());//获取类的完整名称
 8     }
 9 }
10 /*输出
11 class cn.mufasa.demo.Person
12 cn.mufasa.demo.Person
13  */
1 package cn.mufasa.demo;
2 public class Person {
3 }

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

  ·特定:如果要采用此种模式,必须要导入程序所对应的开发包。

 1 package cn.mufasa.demo;
 2 public class JavaAPIDemo4 {
 3     public static void main(String[] args) {
 4         Class<? extends Person> cls=Person.class;//没有进行实例化
 5         System.out.println(cls.getName());
 6     }
 7 }
 8 /*输出
 9 cn.mufasa.demo.Person
10  */

   ③【Class类支持】在Class类中提供有一个static方法:

public static Class<?> forName(String className) throws ClassNotFoundException;
 1 package cn.mufasa.demo;
 2 public class JavaAPIDemo5 {
 3     public static void main(String[] args) throws ClassNotFoundException {
 4         Class<?> cls=Class.forName("cn.mufasa.demo.Person");//需要导入开发包
 5         System.out.println(cls.getName());
 6     }
 7 }
 8 /*输出
 9 cn.mufasa.demo.Person
10  */

  这种模式最大的特定是可以直接采用字符串的形式定义要使用的类型,且程序之中不需要编写任何import语句。如果此时要导入的程序类不存在则会抛出【java.lang.ClassNotFoundException 】异常。

  全部都要使用!!!

posted on 2019-07-10 21:18  周健康  阅读(239)  评论(0编辑  收藏  举报

导航