java文件操作,如何实现一个类似占位的功能

J2EE 码拜 10年前 (2015-04-04) 1686次浏览 0个评论

比如说在struts2框架下,我的action从前台页面接受到某个值,在action中做了该值的条件判断以后。
系统自动在另外一个.java文件中所有代码的某个位置(如匹配字符‘testStart’与‘testEnd’之间)写入一行代码。

举个栗子:

public String test(){
		String aaa = getRequest().getParameter("para");
		if(aaa.equals("bbb")){
			String add = "I want to add the text";
			//接下来我该怎么样把字符串add通过系统的文件操作
			//自动写入.../test.java文件中的某个占位里
		}
		return "aaa";
	}

将add写入…/test.java中:

public String test(){
		testStart
		//I want to add the text写入这里
		endStart
		return "ccc";
	}

有办法实现这样的效果吗?

java文件操作,如何实现一个类似占位的功能
10分
有的,spring的aop(动态代理),你可以看下
java文件操作,如何实现一个类似占位的功能
引用 1 楼 aazbc 的回复:

有的,spring的aop(动态代理),你可以看下

spring不太会用。。。有没有对现有框架没有影响的办法

java文件操作,如何实现一个类似占位的功能
有肯定能实现,java支持动态编译,但是会比较麻烦。你需要组织文件内容生成文件,再编译,再加载class。
不知道楼主为什么会有这种需求,一般的方法,接受参数应该都可以实现楼主的要求。
请问楼主做这个的目的是什么?
java文件操作,如何实现一个类似占位的功能
引用 3 楼 sunshingheavy 的回复:

有肯定能实现,java支持动态编译,但是会比较麻烦。你需要组织文件内容生成文件,再编译,再加载class。
不知道楼主为什么会有这种需求,一般的方法,接受参数应该都可以实现楼主的要求。
请问楼主做这个的目的是什么?

       写一个自动生成代码的工具。。。因为生成文件的方法上面很多输出流的编写,而我们在实际编码中经常会遇到一些条件的判断,比如,可能要引入某个js或者在action中查出某些需要用到的结果集。在生成代码前就需要我们去填写一些调用的参数,通过这些参数判断是否需要向生成的文件中追加某行代码。
        如果这些判断全部都写在一个文件内会很臃肿,代码可读性不强,所以想在别的文件内做判断,再追加条件判断后的动作。

java文件操作,如何实现一个类似占位的功能
自己顶,有大神知道如何实现吗?
java文件操作,如何实现一个类似占位的功能
动态编译可以,3楼正解。
但问题是楼主到底想做什么,感觉应该有其他更好的解决方法,比如反射、接口、泛型。
要考虑到,这样去实现效率很低,说不定请求都超时了。

建议楼主把本来的需求说的更明白一点,而不是自己想了一个不是很恰当的解决方法然后来问后者。

java文件操作,如何实现一个类似占位的功能
1,利用IO流将test.java文件拷贝一份,命名为test.txt。
2,读写test.txt文本内容楼主会吧,将字符串插入到你想要插入的位置
3,将text.java文件删除,将text.txt文件用IO流拷贝一份,文件名为text.java
4,将text.txt删除
java文件操作,如何实现一个类似占位的功能
引用 6 楼 zhblue 的回复:

动态编译可以,3楼正解。
但问题是楼主到底想做什么,感觉应该有其他更好的解决方法,比如反射、接口、泛型。
要考虑到,这样去实现效率很低,说不定请求都超时了。

建议楼主把本来的需求说的更明白一点,而不是自己想了一个不是很恰当的解决方法然后来问后者。

感谢您的回复
我的需求在4楼说过了,差不多就是接收到一个请求。在指定文件指定位置写入一连串的动作。。。您有什么好的实现办法吗?

java文件操作,如何实现一个类似占位的功能
最简单粗暴没效率的方法是 留一个诸如//$001之类的注释 然后读取出来replace掉 你需要后续加上去的话只要在替换的时候末行留个标记就行了
java文件操作,如何实现一个类似占位的功能
10分
如果想有效率一点 使用RandomAccessFile记录游标进行写入
java文件操作,如何实现一个类似占位的功能
10分
如果这个指定文件是java源码,你写完肯定想编译。
文件可以全部读进内存,操作完字符串整体写回。
编译可以用Runtime类调命令行编译器。
调用可以Class.forName取得Instance然后反射调用预定接口
java文件操作,如何实现一个类似占位的功能
10分
原始设计就不够好,为什么不用jvm支持的脚本语言来做,Jython或groovy?

import groovy.lang.GroovyShell;

    
    Binding binding = newBinding();  
    //传递参数  
    binding.setVariable("x",10);  
     binding.setVariable("language", "Groovy");  
      GroovyShell shell = newGroovyShell(binding);  
    //调用,返回值为10  
    Object value =shell.evaluate  
        ("println"Welcome to $language"; y = x * 2; z = x * 3; return x ");  
      

java文件操作,如何实现一个类似占位的功能
嵌入脚本做DSL在有些场景下是唯一解

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java文件操作,如何实现一个类似占位的功能
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!