JAVA利用反射模式调用实现类

本文主讲,利用反射模式调用接口的实现类、抽象类的继承子类。下面请听屌丝一一道来


1.第一步在src下创建 com.newer.reflex


2.在com.newer.reflex包下面建立 IReflex接口,代码如下:
=============================-- start --==================================
package com.newer.reflex;


/**
 * 接口反射模式
 * @author RSun
 * @Date 2012-11-15上午10:07:21
 */
public interface IReflex {

public abstract void display(String str);

}
=============================-- end --==================================


3.在com.newer.reflex包下面建立 AbstractReflex.java抽象类,代码如下:
=============================-- start --==================================
package com.newer.reflex;


/**
 * 抽象类反射模式
 * @author RSun
 * @Date 2012-11-15上午10:05:34
 */
public abstract class AbstractReflex {

public abstract void display(String str);

public void show(){
System.out.println("AbstractReflex非抽象方法show()被调用..." + this.getClass());
}
}
=============================-- end --==================================


4.在com.newer.reflex包下面建立 A.java类, extends AbstractReflex 并实现 IReflex,代码如下:
=============================-- start --==================================
package com.newer.reflex;


/**
 * A
 * @author RSun
 * @Date 2012-11-15上午09:52:34
 */
public class A extends AbstractReflex implements IReflex {


@Override
public void display(String str) {
System.out.println("A类输出:" + str);
}

}
=============================-- end --==================================


5.在com.newer.reflex包下面建立 B.java类, extends AbstractReflex 并实现 IReflex,代码如下:
=============================-- start --==================================
package com.newer.reflex;


/**
 * B
 * @author RSun
 * @Date 2012-11-15上午09:56:05
 */
public class B extends AbstractReflex implements IReflex {


@Override
public void display(String str) {
System.out.println("B类输出:" + str);
}


}
=============================-- end --==================================


6.在com.newer.reflex包下面建立 反射调用工具类ReflexUtil.java类,代码如下:
=============================-- start --==================================
package com.newer.reflex;


import java.util.HashMap;
import java.util.Map;


/**
 * 反射调用工具类
 * @author RSun
 * @Date 2012-11-15上午09:52:18
 */
public class ReflexUtil {

/** A类 **/
public static final int TYPE_A = 1;
/** B类 **/
public static final int TYPE_B = 2;

// 为什么不使用常量?map是为了灵活的CRUD,也可以从数据库配置读取
public static Map map = new HashMap();
static{
map.put(TYPE_A, "com.newer.reflex.A");
map.put(TYPE_B, "com.newer.reflex.B");
}



public static AbstractReflex getAbstractReflex(int type){
String clazzName = map.get(type);
try {
return (AbstractReflex)Class.forName(clazzName).newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}


public static IReflex getIReflex(int type){
String clazzName = map.get(type);
try {
return (IReflex)Class.forName(clazzName).newInstance();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

}
=============================-- end --==================================



7.在com.newer.reflex包下面建立 ReflexTest.java测试类,代码如下:
=============================-- start --==================================
package com.newer.reflex;


/**
 * java反射调用类
 * @author RSun
 * @Date 2012-11-15上午09:45:02
 */
public class ReflexTest {


public static void main(String[] args) {
AbstractReflex re = ReflexUtil.getAbstractReflex(ReflexUtil.TYPE_A);
re.display("调用的是继承类A吗?");
re.show();
System.out.println();

AbstractReflex reb = ReflexUtil.getAbstractReflex(ReflexUtil.TYPE_B);
reb.display("调用的是继承类B吗?");
reb.show();
System.out.println();

IReflex ire = ReflexUtil.getIReflex(ReflexUtil.TYPE_A);
ire.display("调用的是实现类A吗?");
System.out.println();

IReflex ireb = ReflexUtil.getIReflex(ReflexUtil.TYPE_B);
ireb.display("调用的是实现类B吗?");
}

}


=============================-- end --==================================

输出结果如下:


你可能感兴趣的:(JAVA,EE)