动态创建一个原本不存在的class(没有定义好的)

仲景武 2011-06-07 09:59:10
,我要做的 是根据配置的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就可以用的插件,我想做的东西只是处理开发过程中的一个环节,一个螺丝钉。。。。。
...全文
203 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
失去乐山贼 2011-06-07
  • 打赏
  • 举报
回复
路过,帮顶。
ChDw 2011-06-07
  • 打赏
  • 举报
回复
不会啊。应该是你写错了吧

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());

仲景武 2011-06-07
  • 打赏
  • 举报
回复
不是我闭关锁固,开源框架我看了很多。。。。。我只是想搞一个什么也不依赖(或者依赖度很低的)的标签,


“在visitClass中那个类名直接增加包名就可以的” 我试验过了 不行 报错
RothCold 2011-06-07
  • 打赏
  • 举报
回复
用Map或者你把user所有的属性都定义进去,在取值的之后只取一部分就可以了,
ChDw 2011-06-07
  • 打赏
  • 举报
回复
另外,我觉得应该是你调用ASM方法时,没有指定包名吧。在visitClass中那个类名直接增加包名就可以的
ChDw 2011-06-07
  • 打赏
  • 举报
回复
的确一般用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());

龙四 2011-06-07
  • 打赏
  • 举报
回复
按照楼主的想法,其实把查出来的内容放到map就可以实现,为何搞的那么复杂

beanutils里面也有很多这种思想,你可以不用,但,你可以去了解下思想

闭关锁国,闭门造车是很难有自身提高的
龙四 2011-06-07
  • 打赏
  • 举报
回复
“也许你会说有很多开源可以用,但是目前开源往往是提供一个整体的解决方案,我希望是插件形式的,在已有项目中不需要做较大改动”

基本不可能,像eclipse这样出名的东西,很多人给他开发插件,不喜欢用的可以卸载插件。虽然你说的不是eclipse插件,但插件应该具备这种可随时安装可随时卸载的功能

你在你的程序里用了一个jar,如果想让这个jar可以按照某种规则随便替换,是需要花很大精力的,如果common-log的那种思想,否则都是在造轮子

其实很多开源产品都是一个工具箱,而非楼主理解的那种“提供一个整体的解决方案”,但大部分“框架”基本如楼主所言
wangshiyang 2011-06-07
  • 打赏
  • 举报
回复
因为src和webroot不是一个目录级别的! 你如果动态创建的话确实是创建在默认包下面,webroot下面是有个catalant这个文件夹的! 这个要去找找tomcat的内容! 需要项目的权限,然后在src下面写类!

67,541

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧