Java反射,框架设计的灵魂(一):获取Class对象的4种方式

1、什么是反射?

    反射是Java语言的一种动态机制。在程序运行时,对于任意一个类,都可以使用Java的反射特性动态的探知、获取其 全部 成员结构(包括构造函数、成员变量、成员方法)。

2、怎么获取?

        要用反射必须要获取到Class对象,这时候不得不提及Class类,Class类位于 java.lang 包下,它没有定义公有的构造函数,所以我们不能直接创建它的对象。但Java给我们提供了 4种获取Class对象 的方法,让我们来看一下都有哪些。


首先先让我们定义一个空类用来做获取案例:

package cn.demo;

/**
 * 学生类
 */
public class Student {
	
}


    2.1、使用 getClass() 获取Class对象

package cn.demo;

public class mainTest {

	public static void main(String[] args) {
		//获取学生类的对象
		Student stu = new Student();
		//通过 getClass() 方法获取Class对象
		Class cls = stu.getClass();
	}

}
        代码如上所示,这种方法不推荐也基本上不会用到因为使用这种方法获取Class对象是没有意义和没有必要的。你已经持有了Student对象,再去获取Class对象使用反射去探知其结构,完全是画蛇添足。

    2.2、使用 Class.getSuperclass() 获取Class对象

package cn.demo;

public class mainTest {

	public static void main(String[] args) {
		//获取学生类的对象
		Student stu = new Student();
		//通过 getClass() 方法获取Class对象
		Class cls = stu.getClass();
		//获取 ( Student类的Class对象 )的 父类Class对象
		Class clsSuper = cls.getSuperclass();
	}

}
        代码如上所示,这种方法很少会用到getSuperClass() 顾名思义就是获取超类(父类)的Class对象,因为案例Student类中并没有继承任何类,所以 默认继承Object类,这里获取到的也是Object类的Class对象(不信你可以直接打印输出一下这个对象)。

     2.3、使用 类名.class  获取Class对象

package cn.demo;

public class mainTest {

	public static void main(String[] args) {
		//通过 Student.class 获取Class对象
		Class cls = Student.class;
	}

}
        代码如上所示,这种方法也是不推荐的因为 如果要获取Class对象的类在一个jar包中,用这种方法是要导包的,导包会使得程序的依赖性、耦合度提高,不符合我们高内聚低耦合的设计初衷。

     2.4、使用 Class.forName("完整的类路径");  获取Class对象  ( 推荐使用 )

package cn.demo;

public class mainTest {

	public static void main(String[] args) {
		try {
			//通过 Class类提供的静态方法 forName() 获取Class对象
			Class cls = Class.forName("cn.demo.Student");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

}

           代码如上所示,是不是觉得有点眼熟?让我们再看一段代码:

// 加载JDBC驱动
Class.forName("com.mysql.jdbc.Drive");

           想起了吗?没错,用这个方法可以导入JDBC驱动。

          这个方法是由Class类提供的一个静态方法,极力推荐使用这个方法来获取Class对象至于原因,不知道你们是否注意到这种获取方式里的 try-catch块,这里抛出了一个异常: ClassNotFoundException (找不到类、类无法加载异常)为什么会抛出这个异常?细心的人应该注意到了,因为这个方法里传进的是一个 字符串形式的类路径 ,这个异常会在你写错路径时抛出(谁知道你会不会传进来一个乱写的字符串)。因为你传进来的是一个字符串,所以不用导包,这就意味着程序的依赖性、耦合度降低,同时具有很强扩展性(利用properties文件配置数据库驱动就是一个很好的例子)。

            小技巧,在eclipse中选中jar包中的java/class文件,左键选择 Copy Qualified Name 可以获得完整的类名。



至此,获取Class对象的方式全部讲完,在下一篇文章中将会讲解如何利用反射获取构造函数。

上一章:没有

当前章节:Java反射,框架设计的灵魂(一):获取Class对象的4种方式

未更新:Java反射,框架设计的灵魂(二):利用反射获取构造函数

猜你喜欢

转载自blog.csdn.net/u012213094/article/details/80851834
今日推荐