一.获取指定的类或接口相关联的 Class 对象
方法有三种:
- 类名.class
- Class.forname(包名)
- properties集合,在文本文件中写入键值对,值写所在类的完整名称
二.代码实现
package cn.jason01;
import java.io.FileInputStream;
import java.util.Properties;
/**
*获取指定类的Class对象的方法
* 1.类名.class
* 2.Class.forname(包名)
* 3.properties集合,在文本文件中写入键值对,值写所在类的完整名称
* @author Jason
*/
public class ReflectTest {
public static void main(String[] args) throws Exception {
System.out.println("------获取指定的类或接口相关联的 Class 对象------\n");
// 方式1,:类名.class可以获取指定类的class对象
System.out.println(ReflectTest.class);
// 方式2::Class.forname(包名)可以获取指定类的class对象
System.out.println(Class.forName("cn.jason01.ReflectTest"));
//方式3:properties集合,在文本文件中写入键值对,值写所在类的完整名称
// 创建持久性集合
Properties ps = new Properties();
// 文件中不能写分号,否则读取异常
ps.load(new FileInputStream("reflect.ini"));
//根据键获取value值
String st = ps.getProperty("classname");
//根据包名获取类的class对象
Class<?> fn = Class.forName(st);
System.out.println(fn);
}
}
运行结果:
------获取指定的类或接口相关联的 Class 对象------
class cn.jason01.ReflectTest
class cn.jason01.ReflectTest
class cn.jason01.ReflectTest
三.动态修改
在服务器不关闭的情况下,直接更改配置文件就可以动态修改内容。
package cn.jason04;
import java.io.FileInputStream;
import java.util.Properties;
interface Isay {
public abstract void say();
}
class sayChinese implements Isay {
@Override
public void say() {
System.out.println("情不知所起");
}
}
class sayEnglish implements Isay {
@Override
public void say() {
System.out.println("一往情深");
}
}
/**
* 动态修改,服务器端不关闭,只需要更改配置文件即可实现修改
*
* @author Jason
*
*/
public class Test {
public static void main(String[] args) throws Exception {
//创建持久性集合
Properties pr = new Properties();
//模拟服务器
while (true) {
//从本地文件中读取键值对
pr.load(new FileInputStream("class_name.ini"));
//根据文本的键获取到值,值是cn.jason04.sayChinese
String str = pr.getProperty("class_name");
//创建cn.jason04.sayChinese的Class对象
Class<?> name = Class.forName(str);
//创建对象,要使用多态,否则会转换异常,Isay是顶层父类,子类都可以接收
Isay sc = (Isay) name.newInstance();
sc.say();
//停留1500秒,效果比较好
Thread.sleep(500);
}
}
}
截图1:
截图2