最近做毕业设计时遇到一个让我棘手的问题.我的设计是从前台传入我要操作的服务名和数据,在后台我可以把它们解析出类名和方法名,以及通过服务名从xml文件中提出sql语句.所以这个类名是动态的,所以我必须动态的实例化我要操作的类.我从网上找了一些这方面的资料后能实现这个动态类的实例化.我定义了一个操作的接口Service   
 public interface  Service {
 public List query();
 public void add();
 public void delete();
 public void modify();
}
装载所有类名及classpath
public class ServiceConfig {
 public static HashMap servicmap=new HashMap();
 public static String getService(String servicename){
  servicmap.put("User","bin.User");
  servicmap.put("Person","bin.Person");
  String serviceclass="";
  serviceclass=ServiceConfig.servicmap.get(servicename).toString();
  return serviceclass;
 }
}
实例化动态类,并返回我查询的数据.
public class ServicExecuteHelper {
 
 public static  void execute(String servicename){
  List list=null;
  String serviceclass=ServiceConfig.getService(servicename);
  System.out.println(serviceclass);
  if(serviceclass!=null&&!serviceclass.equals("")){
   try {
    Class obj=Class.forName(serviceclass);
    Service service=(Service)obj.newInstance();
    list=service.query();
    Iterator it=list.iterator();
    while(it.hasNext()){
     Person person=new Person();
     person=(Person) it.next();
     System.out.println(person.getId()+person.getName()+person.getAge()+person.getPassword()+person.getEmail());  
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}
蓝色部分就是出问题的部分,因为我的类是动态的,作为一个公共的实例化类,在此处应该动态的实例化Person类,并根据Person类里面的getXXX方法提取list对象里面的数据,可能是经验不足,在设计时没有找到更好的设计思想.希望各位大虾指点迷津,推荐点资料和书看看也可以.

解决方案 »

  1.   

    动态加载类:
    String className = "xxxx";
    Service obj = (Service) Class.forName(className).newInstance();
    就是这样.
      

  2.   

    用getXXX方法比较麻烦,先要获得所有的method,还要判断方法名。如果直接拿里面的filed就比较简单。
            Class class=Class.forName("com.Person"); 
            Field[] fileds = cla.getDeclaredFields();
            for(int i=0;i<fileds.length;i++){
                fileds[i].setAccessible(true);
                System.out.println(fileds[i].get(obj));
            }
            
    用getXXX方法可以参考帖子http://topic.csdn.net/u/20090121/15/5839a568-7256-416e-a1a5-f4b0ddff764b.html