,我要做的 是根据配置的sql语句 例如 select name as name,age as age from user as user 动态创建 javaBean,  
例如public class User{
  private String name;
  private String age;  public void setName(String name){
  this.name=name;
  }
  public void getName(){
  return this.name;
  }
  public void setAge(String name){
  this.age=age;
  }
  public void getAge(){
  return this.Age;
  }
}然后自己做标签 做出一个增删改查,加搜索的模板来,如果这样配置个sql就可以了,然后jsp页面也是动态生成的。我在系统里有个配置sql的页面,提交一条sql配置相应的 jsp名称和路径 就可以访问这个sql对应的 信息表格了,之前我用asm动态创建class(强调一下::::是创建不是动态修改),但是创建的class被放到工程下默认包下面,我想指定包路径,但是没有找到相应设置的地方。也许你会说有很多开源可以用,但是目前开源往往是提供一个整体的解决方案,我希望是插件形式的,在已有项目中不需要做较大改动,导入n个jar就可以用的插件,我想做的东西只是处理开发过程中的一个环节,一个螺丝钉。。

解决方案 »

  1.   

    因为src和webroot不是一个目录级别的!  你如果动态创建的话确实是创建在默认包下面,webroot下面是有个catalant这个文件夹的!  这个要去找找tomcat的内容!  需要项目的权限,然后在src下面写类!
      

  2.   

    “也许你会说有很多开源可以用,但是目前开源往往是提供一个整体的解决方案,我希望是插件形式的,在已有项目中不需要做较大改动”基本不可能,像eclipse这样出名的东西,很多人给他开发插件,不喜欢用的可以卸载插件。虽然你说的不是eclipse插件,但插件应该具备这种可随时安装可随时卸载的功能你在你的程序里用了一个jar,如果想让这个jar可以按照某种规则随便替换,是需要花很大精力的,如果common-log的那种思想,否则都是在造轮子其实很多开源产品都是一个工具箱,而非楼主理解的那种“提供一个整体的解决方案”,但大部分“框架”基本如楼主所言
      

  3.   

    按照楼主的想法,其实把查出来的内容放到map就可以实现,为何搞的那么复杂beanutils里面也有很多这种思想,你可以不用,但,你可以去了解下思想闭关锁国,闭门造车是很难有自身提高的
      

  4.   

    的确一般用Map已经足够了,但是如果你坚持使用动态创建类建议使用CGLib + Asm,这样写起来才方便,直接使用ASM累死人
    BeanGenerator gen = new BeanGenerator() {
    {
    setNamePrefix("chdw.Object");
    }
    };
    gen.addProperty("A", String.class);
    gen.setSuperclass(Object.class);
    System.out.println(gen.createClass());
      

  5.   

    另外,我觉得应该是你调用ASM方法时,没有指定包名吧。在visitClass中那个类名直接增加包名就可以的
      

  6.   

    用Map或者你把user所有的属性都定义进去,在取值的之后只取一部分就可以了,
      

  7.   

    不是我闭关锁固,开源框架我看了很多。。我只是想搞一个什么也不依赖(或者依赖度很低的)的标签,
    “在visitClass中那个类名直接增加包名就可以的”  我试验过了  不行  报错
      

  8.   

    不会啊。应该是你写错了吧 ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS);
    writer.visit(Opcodes.V1_5, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, "chdw/A", null,
    "java/lang/Object", new String[0]);
    writer.visitSource("Simple.java", null); MethodVisitor methodVisitor = writer.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
    methodVisitor.visitCode();
    methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
    methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
    methodVisitor.visitInsn(Opcodes.RETURN);
    methodVisitor.visitMaxs(0, 0);
    methodVisitor.visitEnd();

    final byte[] b = writer.toByteArray();
    Class clz = new ClassLoader() {
    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
    if(name.equals("chdw.A"))
    return defineClass("chdw.A", b, 0, b.length);
    else
    return super.loadClass(name);
    }
    }.loadClass("chdw.A");
    System.out.println(clz.newInstance().getClass().getName());