`

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

    博客分类:
  • java
 
阅读更多

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

 

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

 

 

 

分享到:
评论

相关推荐

    两句话理解js中的this1

    而内部的匿名函数是一个普通函数,它的`this`指向全局作用域(`window`),所以第二次`console.log(this.val)`输出`1`。 通过这些例子,我们可以更好地理解`this`的关键点:普通函数的`this`由调用方式决定,箭头...

    常用jquery ajax方法总结

    2. `$.get()`: 用于发起 GET 请求,接受 URL 和回调函数作为参数,简化了 `$.ajax()` 的使用。 3. `$.post()`: 类似于 `$.get()`,但用于发起 POST 请求。同样接受 URL 和回调函数,还可以传递额外的数据。 4. `$....

    jquery中为什么能用$操作

    在匿名函数内部,`jQuery`函数被定义为一个构造函数,它的实例化过程通过`jQuery.fn.init`完成。`jQuery.fn`实际上是`jQuery.prototype`的别名,这意味着当你调用`jQuery`时,实际上是在调用一个构造函数,创建一个...

    JQuery函数大全

    - **`$(selector).val()`** 和 **`$(selector).val(value)`** - 示例: - `$("inputElement").val();` 获取表单元素的值。 - `$("inputElement").val("value");` 设置表单元素的值。 - 功能: - 获取或设置...

    Super关键字的几点应用

    如果父类中定义了一个匿名内部类,子类可以通过`super`关键字引用它,但这通常只在特定场景下发生,比如处理事件监听器。 最后,"super"关键字与Java的this关键字相对应,this代表当前对象,而super则代表当前对象...

    jquery函数大全

    - `$.extend(prop)` 扩展jQuery对象,例如添加自定义方法。 - `$(expression, [context]);` 查询DOM元素,context可选地指定上下文。 5. **其他实用函数**: - `each(callback)` 遍历每个匹配元素并执行回调函数...

    KotlinDemo.rar

    - **匿名内部类**:你可以为按钮设置一个OnClickListener对象,通过匿名内部类实现onClick方法。例如: ```kotlin button.setOnClickListener { // 点击事件处理代码 } ``` - **Lambda表达式**:Kotlin支持...

    jQuery获取this当前对象子元素对象的方法

    当`#city`的选择发生变化时,`change`事件触发,内部的匿名函数会被执行。在这个函数内部,`this`会指向触发事件的元素,也就是`<select>`元素本身。 现在,我们要在事件处理函数中获取选中的`<option>`的值。有几...

    Jquery常用方法.txt

    - `$.extend(prop)` - **描述**:扩展jQuery原型对象,添加自定义的方法。 7. **执行表达式**: - `jQuery(expression,[context])` 或 `$(expression,[context]);` - **描述**:通过提供的表达式获取DOM元素,`...

    2010阿里巴巴全国校园前端招聘笔试题及答案.pdf

    - ② 使用匿名函数包裹`doSomething`,如`element.onclick = function() {doSomething()}`,此时`this`仍然会绑定到全局对象,因为匿名函数内部没有指定上下文,所以`this`默认为`window`。 - ③ 直接执行`...

    编程思想读书笔记.docx

    然而,当需要区分局部变量和实例变量,或者在匿名内部类或回调方法中引用当前对象时,`this`就变得必不可少。避免过度使用`this`可以提高代码的可读性。 最后,Java在创建对象时,会先初始化变量。在构造方法执行...

    jQuery $.each的用法说明

    使用$.each()方法来遍历数组,每次迭代中执行一个匿名函数,该匿名函数只有一个参数,即数组当前元素的值。在这个函数内部,使用alert弹出当前元素的值。因此,依次弹出的值就是数组中的元素,顺序为"abcde"。 当...

    模仿jQuery each函数的链式调用

    _$.prototype = { each: function(fn){ for (var i = 0; i < this.elements.length; i++) { fn.call(this, this.elements[i]); } }, setStyle: function(prop, val){ var that = this; this.each(function...

    全面解析JavaScript Module模式

    模块模式的关键在于利用匿名函数和闭包来创建私有作用域,从而保护内部变量和函数不被全局空间污染。 ### 基本用法 Module模式的基本实现通常涉及到一个立即执行的匿名函数,通过这个函数创建一个私有作用域。在...

    Kotlin简单实现Android事件

    1. **匿名内部类方式**:这是最传统的做法,虽然略显冗长,但依然有效。 ```kotlin button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { // 点击事件处理代码 } }) ```...

    GDC招聘笔试题。。。

    在Java中,使用匿名内部类的方式: ```java JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 处理点击事件的代码 } })...

    Jquery 常用方法一览表(集合)

    - `$.extend(prop)`: 扩展jQuery对象,添加新的方法或属性。 - `$(expression, context)`: 在指定的上下文中查找元素。 - `each(callback)`: 遍历jQuery对象中的每个元素,执行回调函数。 这些只是jQuery众多...

    Android-从Java到Kotlin-您的JavaToKotlin速查表

    - Kotlin的高阶函数和lambda表达式简化了回调和匿名内部类,如:`(x) -> x * x`,而在Java中需要实现接口。 4. **集合与遍历** - Kotlin提供了`List`, `Set`, `Map`等集合的泛型接口,与Java相似,但其操作更加...

Global site tag (gtag.js) - Google Analytics