Spring 笔记 -02- Class.forName 运用反射的原理创建对象
本篇注意介绍映射机制,不必纠结数据
创建项目:
(1)创建项目我就省了,详情查看上一篇:Spring 笔记 -01- JUnit 单元测试
(2)先看一下完整目录:
(MyClass 用不着)
(3)新建 java 类,设置成接口 interface,命名为 ITrans.java,代码为:
package com.learn01;
public interface ITrans {
public double speed(double A, double B,double C);
}
(4)新建实现类,Plane.java:
package com.learn01;
public class Plane implements ITrans{
public double speed(double A, double B,double C){
return A*B-C;
}
}
(5)新建测试类,TestTrans.java:
提示:
(1)JOptionPane 是一个弹出对话框
(2)car 就是一个中间变量,通过输入的名字,来找自己的实现类,这样我们可以通过在输入的时候输入不同的实现类名,而不需要修改代码。
(3)注意名称的对应
package com.learn01;
import org.junit.Test;
import javax.swing.*;
public class TestTrans {
@Test
public void test(){
try {
String car = JOptionPane.showInputDialog("请输入");
ITrans common = (ITrans) Class.forName("com.learn01."+car).newInstance();
double time = 1000/common.speed(32,65,11);
System.out.println(car + "=" + time);
} catch(Exception e){
System.out.println(e.getMessage());
}
}
}
(6)这里是单元测试,可以运行
Class.forName()的作用与使用总结
Java 程序在运行时,Java 运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是 Class 类。Class 类封装一个对象和接口运行时的状态,当装载类时, Class 类型的对象自动创建。
Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个 Class 对象。
虚拟机为每种类型管理一个独一无二的 Class 对象。也就是说,每个类(型)都有一个 Class 对象。运行程序时,Java 虚拟机(JVM)首先检查是否 所要加载的类对应的 Class 对象是否已经加载。如果没有加载,JVM 就会根据类名查找 .class 文件,并将其 Class 对象载入。
基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也都对应一个 Class 对象。
每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
一般某个类的 Class 对象被载入内存,它就用来创建这个类的所有对象。
如何得到 Class 的对象呢?
有三种方法可以的获取:
1、调用Object类的getClass()方法来得到Class对象,这也是最常见的产生Class对象的方法。例如:
MyObject x;
Class c1 = x.getClass();
2、使用Class类的中静态forName()方法获得与字符串对应的Class对象。例如:
Class c2=Class.forName(“MyObject”),Employee必须是接口或者类的名字。
3、获取 Class 类型对象的第三个方法非常简单。如果 T 是一个 Java 类型,那么 T.class 就代表了匹配的类对象。例如
Class cl1 = Manager.class;
Class cl2 = int.class;
Class cl3 = Double[].class;
注意:Class 对象实际上描述的只是类型,而这类型未必是类或者接口。例如上面的 int.class 是一个 Class 类型的对象。由于历史原因,数组类型的 getName 方法会返回奇怪的名字。
Class 类的常用方法
1、getName()
一个Class对象描述了一个特定类的属性,Class类中最常用的方法getName以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
2、newInstance()
Class还有一个有用的方法可以为类创建一个实例,这个方法叫做newInstance()。例如:
x.getClass.newInstance(),创建了一个同x一样类型的新实例。newInstance()方法调用默认构造器(无参数构造器)初始化新建对象。
3、getClassLoader()
返回该类的类加载器。
4、getComponentType()
返回表示数组组件类型的 Class。
5、getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。
6、isArray()
判定此 Class 对象是否表示一个数组类。
三、Class的一些使用技巧
1、forName和newInstance结合起来使用,可以根据存储在字符串中的类名创建对象。例如
Object obj = Class.forName(s).newInstance();
2、虚拟机为每种类型管理一个独一无二的Class对象。因此可以使用==操作符来比较类对象。例如:
if(e.getClass() == Employee.class)…