反射模拟服务器动态修改内容

一.获取指定的类或接口相关联的 Class 对象

方法有三种:

  1. 类名.class
  2. Class.forname(包名)
  3. 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值