反射运用----动态代理
本人对动态代理的理解不深,下面实现的动态代理,大致是通过代理类得到的参数来决定调用的哪个实现类的实例,而这个参数可以动态的在配置文件中,也可以在数据库中保存,这样在不修改代码的情况下一样可以实现某些功能的转换。
例:三个人的工作,A是苦逼程序员,B是公务员,C是人民警察。这样可以写一个工作描述类接口IWorkDescribe,这时候实现类就有3个,WorkADescribeImpl,WorkBDescribeImpl , WorkCDescribeImpl。在正常情况下没问题,但是突然有一天B辞职了,转行为A了,这样在工作描述方法时就要修改代码,把WorkBDescribeImpl的所有实例化换成A,在代码复杂的情况下这样就很不方便而且容易出错。于是就利用反射,我们在配置文件时就给ABC三人一个工作参数,分别为A,B,C。通过代理,获取这3个人的工作参数来选取到底实例化哪个实现类,这样当某个人转行时,我们只需要修改配置文件中这个人的工作参数就可以了,这就是我理解和实现的动态代理。
代码实例
- //接口类
- public interface IWorkDescribe {
- public void workService( );
- }
- //A工作实现类
- public class WorkADescribeImpl implements IWorkDescribe {
- @Override
- public void workService( ){
- System.out.println(“工作A描述”);
- }
- }
- //B工作实现类
- public class WorkBDescribeImpl implements IWorkDescribe {
- @Override
- public void workService( ){
- System.out.println(“工作B描述”);
- }
- }
- //C工作实现类
- public class WorkCDescribeImpl implements IWorkDescribe {
- @Override
- public void workService( ){
- System.out.println(“工作C描述”);
- }
- }
- //代理类实现
- public class TranCodeServiceProxy {
- /**
- * 获取并运行服务
- * @param pack
- * @param trancode
- * @param params
- * @return
- * @throws TranCodeException
- */
- public static final void doService(String trancode)
- throws Exception {
- long startTime = System.currentTimeMillis();
- try {
- IWorkDescribe server = getService(trancode);//获取代理类对象
- System.out.println(“代理器启动服务【” + trancode + “】获取服务成功:”
- + server);
- doService(server);
- } catch (Exception e) {
- System.out.println(“代理器启动服务【” + trancode + “】失败:”
- + e.getMessage());
- throw e;
- } finally {
- System.out.println(“代理器启动服务【” + trancode
- + “】完成,用时(ms):” + (System.currentTimeMillis() - startTime));
- }
- }
- /**
- * 获取服务
- * @param pack
- * @param trancode
- * @return
- * @throws TranCodeException
- */
- private static final IWorkDescribe getService(String trancode) throws Exception {
- try {
- Class<?> clazz = Class.forName(“com.work.service.”
- + “Work”
- + trancode
- + “DescribeImpl”);
- return (IWorkDescribe) clazz.newInstance();
- } catch (Exception e) {
- throw new Exception(“未知服务代码【”
- + trancode + “】”, e);
- }
- }
- /**
- * 运行服务
- * @param server
- * @param params
- * @return
- * @throws TranCodeException
- */
- private static final void doService(IWorkDescribe server) throws Exception {
- try {
- server.workService();//运行接口实现类方法
- } catch (Exception e) {
- throw (Exception)e;
- }
- System.out.println(“代理器启动服务【” + server + “】处理结果:”
- + “成功”);
- }
- }
- //测试类
- public class TestMain {
- /**
- * @param args
- */
- public static void main(String[] args) {
- String people1 = “A”;//可以从配置文件或者数据库读取这个值,由这个值来指定调用哪个哪个实现类
- String people2 = “B”;
- String people3 = “C”;
- try {
- TranCodeServiceProxy.doService(people1);
- TranCodeServiceProxy.doService(people2);
- TranCodeServiceProxy.doService(people3);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
还没有评论,来说两句吧...