匿名内部类 this.val$的问题

本文解析了反编译代码中出现的匿名内部类使用外部参数未加final、构造器参数错误及奇怪的val$用法等问题,并给出了正确的代码修改方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反编译一个项目,出现以下代码

 

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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值