讲一个简单的实例:
1.interface
public interface Operator {
public java.util.List act(String content,String content2,java.util.List params);
}
2.class
public class Success implements Operator {
public List act(String content, String content2, List params) {
/*
* author:jerry @param @return
*/
List result = new ArrayList();
result.add(content);
result.add(content2);
result.add(params);
return result;
}
/**
* @param args
*/
public static void main(String[] args) {
/*
* author:jerry @param @return
*/
List list = new ArrayList();
list.add("Success3");
//list.add("Success4");
Operator op = new Success();
System.out.println("act===" + op.act("Success1", "Success2", list));
}
3.class
public class TestReflect {
/**
* @param args
*/
// 加载配置文件,查询消息头对应的类名
private String loadProtocal(String header) {
String result = null;
try {
Properties prop = new Properties();
prop.load(getTCL().getResourceAsStream("cn.properties"));
result = prop.getProperty(header);
} catch (Exception e) {
System.out.println(e);
}
return result;
}
private static ClassLoader getTCL() throws IllegalAccessException,
InvocationTargetException {
Method method = null;
try {
method = Thread.class.getMethod("getContextClassLoader", null);
} catch (NoSuchMethodException e) {
return null;
}
return (ClassLoader) method.invoke(Thread.currentThread(), null);
}
// 针对消息作出响应,利用反射导入对应的类
public String response(String header, String content, String content2,
List list) {
String result = null;
String s = null;
try {
/*
* 导入属性文件emp.properties,查询header所对应的类的名字
* 通过反射机制动态加载匹配的类,所有的类都被Operator接口隔离
*/
s = "reflect." + this.loadProtocal(header).trim();
//s="reflect."+header.trim();
// 加载类
System.out.println("s===" + s);// 打印 s===reflect.Success
Class c = Class.forName(s);
// 创建类的事例
Operator mo = (Operator) c.newInstance();
System.out.println("mo===" + mo);
// 构造参数列表
Class params[] = new Class[3];
// params[0]=Class.forName("java.util.List");
params[0] = Class.forName("java.lang.String");
params[1] = Class.forName("java.lang.String");
params[2] = Class.forName("java.util.List");
System.out.println("params[0]===" + params[0]);
// //查询act方法
Method m = c.getMethod("act", params);
System.out.println("method==" + m.toString());
Object[] args = new Object[3];
args[0] = content;
args[1] = content2;
args[2] = list;
// //调用方法并且获得返回
Object returnObject = m.invoke(mo, args);// 这个地方出问题了,抛异常~~~~
System.out.println("returnObject==="+returnObject);
List result2 = (List) returnObject;
result = (String) result2.get(0);
System.out.println("result2==" + result2);
//
} catch (Exception e) {
System.out.println("Handler-response:" + e);
}
return result;
}
public static void main(String[] args) {
/*
* author:jerry @param @return
*/
TestReflect tr = new TestReflect();
List list = new java.util.ArrayList();
list.add("测试List");
tr.response("1000", "Success1", "Success2", list);
}
}
4.cn.properties(放在项目根目录下,否则会有异常抛出)
1000=Success
5.完成。