本文主讲,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);
} //www.sctarena.com
=============================-- 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吗?");
}
}