代码片段如下:TimerTask task = new TimerTask() { public void run() {
try
{
doWhat(); //我想在这里可以得到传值 } catch (IOException e)
{
System.err.println(e);
}
}
};Timer timer = new Timer();timer.schedule(task,date);//doWhat()定期执行因为inner class的问题无法对run()中的参数进行传值,求教如何修改代码可以实现传值?
try
{
doWhat(); //我想在这里可以得到传值 } catch (IOException e)
{
System.err.println(e);
}
}
};Timer timer = new Timer();timer.schedule(task,date);//doWhat()定期执行因为inner class的问题无法对run()中的参数进行传值,求教如何修改代码可以实现传值?
解决方案 »
- 我是新手,拜托大侠们看下这个例子,怎么运行不了啊?
- 0-653335之间的数,如果用Java正则表达式表示,谢谢。
- java程序如何实现在后台运行?
- 30分求教关于java中Timer的使用
- 如何检查一个字符串是否为文件(或是目录)?
- 关于手机游戏编程,急~~~
- 如何从excel里读取已更新过的数据?而不是全部读一遍。
- new几个相同的类,对于方法(method)的内存分配问题?大家公用一块方法的空间,还是每个都有自己的空间?
- 寻找jdk
- 谁有 VisualCafe Standard Edition 4.5的license或注册机
- hashmap和hashset啥区别,感谢
- 我写了一个多线程下载,下载本地文件可以,但是下载网上的文件就不行了。不知道哪里有问题,请大侠们指教?
private static SysPara sysPara;private SysPara(){Load();}private String para1;
private String para2;
....public static synchronized SysPara getInstance(){
if ( sysPara == null ){
sysPara = new SysPara();
}
return sysPara ;
}
....
}
谢谢
但是我的inner class是写在servlet的doPost里的
servlet本身没有main函数,你所说的方法还可以实现吗?
TestServlet.java:31: inner classes cannot have static declarations
private static SysPara sysPara;
^
TestServlet.java:33: cannot find symbol
symbol : method Load()
location: class SysPara
private SysPara(){Load();}
^
TestServlet.java:44: non-static variable this cannot be referenced from a static
context
sysPara = new SysPara();好象还是因为innner class的问题使它不能初始化
^
谢谢 我试着把代码改成...
class Task extends TimerTask
{
public void run() {
try
{
doWhat(); //我想在这里可以得到传值 } catch (IOException e)
{
System.err.println(e);
}
}
}Timer timer = new Timer();
timer.schedule(new Task,date);//doWhat()定期执行
...问题依旧,你指的是不是把class Task单独写成一个.java文件后编译呢?
这样的话是不是要做成package来import呢?
在你的inner里使用他: SysPara.getInstance.getParaX();
SysPara.java:8: cannot find symbol
symbol : method Load()
location: class SysPara
{Load();}
^
这个类需要import什么包吗?
getXXXX();//在程序寄托的类里定义一个getXXXX()函数就可以把值传进来了
try
{
doWhat(); //我想在这里可以得到传值 } catch (IOException e)
{
System.err.println(e);
}
}
};Timer timer = new Timer();
timer.schedule(task,date);
不知道这样可以实现功能不
doPost(HttpServletRequest req, HttpServletResponse resp) {
……
Timer timer = new Timer();
timer.schedule(new Task(99), date);
……
}
}class Task extends TimerTask
{
private int param;
public Task(int param) { this.param = param; }
public void run() {
try {
doWhat(param);
} catch (IOException e) {
System.err.println(e);
}
}
……
}BTW: 你原来那种写法不叫 Inner Class,应该叫 Anonymous Class。
{
String taskname = request.getParameter("task");
public String getTaskname()
{
return this.taskname;
}
public void XXX()
{
TimerTask task = new TimerTask() {public void run() { try
{
getTaskname();//传了你想要的值
doWhat(getTaskname()); //我想在这里可以得到传值 } catch (IOException e)
{
System.err.println(e);
}
}
};
Timer timer = new Timer();
timer.schedule(task,date);
}
}
http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.1.3关于 Class 的类型,有下面几个说法,比较容易混淆,最好仔细弄清楚(它们不是并列的概念):
Anonymous Class
Inner Class
Member Class
Nested Class而我说的 Class,并不是上面这些“特殊”的 Class 类型,而只是“普通”的 Class,唯一有点特别的是,它不是占据一个单独的 .java 文件,而是写在 MyServlet.java 文件里面,跟 MyServlet 并列。
至于你说的要把从 HTTP request 里面得到的参数传给它,就可以像下面这样做(以下内容都在 MyServlet.java 文件中):public class MyServlet extends HttpServlet {
void doPost(HttpServletRequest req, HttpServletResponse resp) {
……
Timer timer = new Timer();
timer.schedule(new Task( req.getParameter("id") ), date);
……
}
}class Task extends TimerTask
{
private String param;
public Task(String param) { this.param = param; }
public void run() {
try {
doWhat(param);
} catch (IOException e) {
System.err.println(e);
}
}
……
}
不知道为什么我定义了
public String getTaskname()
{
return this.taskname;
}
后编译时这里报错: illegal start of expression还有在doWhat(getTaskname());
这里也报错:invalid method declaration; return type required
/*
你说的“外围类.this.xxx;”,一般来说,应该可以用这个方法访问到外围类的内容,但对于本贴的这个问题来说,内嵌类是延迟执行的,而外围类又是一个 servlet,由于 servlet 实例的重用,恐怕实际访问到的内容已经不是当初期望的东西了吧?
*/对的,是可能存在servlet实例重用问题.你所说的类的使用我明白了,但还有一点不清楚,这个"普通"类class Task能否得到doPost定义的String的传值?比如doPost里有String name = request.getParameter("ID");能否实现在run()里的system.out.println(name);?
> 比如doPost里有String name = request.getParameter("ID");
> 能否实现在run()里的system.out.println(name);?我前面“2006-7-20 16:32:47”发的帖子不就是把一个字符串传到 Task 对象里去,然后在 run() 里使用的吗?