匿名内部类 this.val$的问题
程序员文章站
2022-05-26 16:09:26
...
反编译一个项目,出现以下代码
public FlexgridView insertFlexgrid(FlexgridView flexgridView){ Flexgrid flexgrid = FlexgridViewUtils.getFlexgrid(flexgridView); Flexgrid newFlexgrid = (Flexgrid)getTransactionTemplate() .execute(new TransactionCallback(flexgrid) { public Object doInTransaction(TransactionStatus arg0) { return FlexgridServiceImpl.this.getFlexgridDomain().insertFlexgrid(this.val$flexgrid); } }); return FlexgridViewUtils.getFlexgridView(newFlexgrid); }
可参考链接:
http://www.mindfiresolutions.com/A-tip-on-val$-field-in-Java-decompiled-code-1725.php
这些代码都是编译器反编译的时候自己添加上去的。
第一个问题:匿名内部类要使用外面的参数,必须要加final。而代码中却没有加。
第二个问题:new TransactionCallback这个类没有带参数的构造器。
第三个问题:this.val$这种用法很怪异,val$是哪里来的。
这些问题都是反编译器给我们搞的鬼。
匿名内部类要使用外部的变量,或者参数,这个变量和参数都必须是final类型。而且匿名内部类没有构造器他的构造器是继承于父类,这就还有一个问题就是那我们如何初始化内名内部类中的变量,只需要使用“{}”在里面初始化变量不需要任何修饰。再就是在匿名内部类中this表示当前对象,如果要使用外部类对象需要加上Outclass.this这才是外部对象。
所以以上代码做如下修改:
public FlexgridView insertFlexgrid(FlexgridView flexgridView) { final Flexgrid flexgrid = FlexgridViewUtils.getFlexgrid(flexgridView);//参数加上final Flexgrid newFlexgrid = (Flexgrid) getTransactionTemplate().execute( new TransactionCallback() {//额外的参数去掉 public Object doInTransaction(TransactionStatus arg0) { return FlexgridServiceImpl.this.getFlexgridDomain() .insertFlexgrid(flexgrid);//"this.val$" 多余的去掉 } }); return FlexgridViewUtils.getFlexgridView(newFlexgrid); }
推荐阅读
-
python爬虫 下载一个网页内的图片解决分页以及图片懒加载的问题
-
Java开发笔记(六十)匿名内部类的优势
-
解决webview内的iframe中的事件不可用的问题
-
.Net Reactor混淆导致匿名类处理出现的问题处理分析
-
docker容器内安装TensorRT的问题
-
一招巧妙解决U盘内的内容显示不出来(不显示)的问题
-
PHP生成excel时单元格内换行问题的解决方法
-
使用php的fork进行父子进程代码编写,你至少需要对linux fork有这几点基础的理解。--- 记一次组内同学的fork问题排查
-
golang 使用匿名结构体的问题
-
匿名内部类的使用以及Java8引入的Lambda表达式对匿名内部类的简化