反编译一个项目,出现以下代码
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); }
相关推荐
而内部的匿名函数是一个普通函数,它的`this`指向全局作用域(`window`),所以第二次`console.log(this.val)`输出`1`。 通过这些例子,我们可以更好地理解`this`的关键点:普通函数的`this`由调用方式决定,箭头...
2. `$.get()`: 用于发起 GET 请求,接受 URL 和回调函数作为参数,简化了 `$.ajax()` 的使用。 3. `$.post()`: 类似于 `$.get()`,但用于发起 POST 请求。同样接受 URL 和回调函数,还可以传递额外的数据。 4. `$....
在匿名函数内部,`jQuery`函数被定义为一个构造函数,它的实例化过程通过`jQuery.fn.init`完成。`jQuery.fn`实际上是`jQuery.prototype`的别名,这意味着当你调用`jQuery`时,实际上是在调用一个构造函数,创建一个...
- **`$(selector).val()`** 和 **`$(selector).val(value)`** - 示例: - `$("inputElement").val();` 获取表单元素的值。 - `$("inputElement").val("value");` 设置表单元素的值。 - 功能: - 获取或设置...
如果父类中定义了一个匿名内部类,子类可以通过`super`关键字引用它,但这通常只在特定场景下发生,比如处理事件监听器。 最后,"super"关键字与Java的this关键字相对应,this代表当前对象,而super则代表当前对象...
- `$.extend(prop)` 扩展jQuery对象,例如添加自定义方法。 - `$(expression, [context]);` 查询DOM元素,context可选地指定上下文。 5. **其他实用函数**: - `each(callback)` 遍历每个匹配元素并执行回调函数...
- **匿名内部类**:你可以为按钮设置一个OnClickListener对象,通过匿名内部类实现onClick方法。例如: ```kotlin button.setOnClickListener { // 点击事件处理代码 } ``` - **Lambda表达式**:Kotlin支持...
当`#city`的选择发生变化时,`change`事件触发,内部的匿名函数会被执行。在这个函数内部,`this`会指向触发事件的元素,也就是`<select>`元素本身。 现在,我们要在事件处理函数中获取选中的`<option>`的值。有几...
- `$.extend(prop)` - **描述**:扩展jQuery原型对象,添加自定义的方法。 7. **执行表达式**: - `jQuery(expression,[context])` 或 `$(expression,[context]);` - **描述**:通过提供的表达式获取DOM元素,`...
- ② 使用匿名函数包裹`doSomething`,如`element.onclick = function() {doSomething()}`,此时`this`仍然会绑定到全局对象,因为匿名函数内部没有指定上下文,所以`this`默认为`window`。 - ③ 直接执行`...
然而,当需要区分局部变量和实例变量,或者在匿名内部类或回调方法中引用当前对象时,`this`就变得必不可少。避免过度使用`this`可以提高代码的可读性。 最后,Java在创建对象时,会先初始化变量。在构造方法执行...
使用$.each()方法来遍历数组,每次迭代中执行一个匿名函数,该匿名函数只有一个参数,即数组当前元素的值。在这个函数内部,使用alert弹出当前元素的值。因此,依次弹出的值就是数组中的元素,顺序为"abcde"。 当...
_$.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...
模块模式的关键在于利用匿名函数和闭包来创建私有作用域,从而保护内部变量和函数不被全局空间污染。 ### 基本用法 Module模式的基本实现通常涉及到一个立即执行的匿名函数,通过这个函数创建一个私有作用域。在...
1. **匿名内部类方式**:这是最传统的做法,虽然略显冗长,但依然有效。 ```kotlin button.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { // 点击事件处理代码 } }) ```...
在Java中,使用匿名内部类的方式: ```java JButton button = new JButton(); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 处理点击事件的代码 } })...
- `$.extend(prop)`: 扩展jQuery对象,添加新的方法或属性。 - `$(expression, context)`: 在指定的上下文中查找元素。 - `each(callback)`: 遍历jQuery对象中的每个元素,执行回调函数。 这些只是jQuery众多...
- Kotlin的高阶函数和lambda表达式简化了回调和匿名内部类,如:`(x) -> x * x`,而在Java中需要实现接口。 4. **集合与遍历** - Kotlin提供了`List`, `Set`, `Map`等集合的泛型接口,与Java相似,但其操作更加...