匿名类怎么反编译出来
⑴ 匿名类的问题
匿名类是不能有名称的类,所以没办法引用它们。必须在创建时,作为new语句的一部分来声明它们。
这就要采用另一种形式的new语句,如下所示:
new <类或接口> <类的主体>
这种形式的new语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。它还创建那个类的一个新实例,并把它作为语句的结果而返回。要扩展的类和要实现的接口是new语句的操作数,后跟匿名类的主体。
假如匿名类对另一个类进行扩展,它的主体可以访问类的成员、覆盖它的方法等等,这和其他任何标准的类都是一样的。假如匿名类实现了一个接口,它的主体必须实现接口的方法。
注重匿名类的声明是在编译时进行的,实例化在运行时进行。这意味着for循环中的一个new语句会创建相同匿名类的几个实例,而不是创建几个不同匿名类的一个实例。
从技术上说,匿名类可被视为非静态的内部类,所以它们具有和方法内部声明的非静态内部类一样的权限和限制。
假如要执行的任务需要一个对象,但却不值得创建全新的对象(原因可能是所需的类过于简单,或者是由于它只在一个方法内部使用),匿名类就显得非常有用。匿名类尤其适合在Swing应用程序中快速创建事件处理程序。
资料引用:http://www.knowsky.com/369271.html
classnotfoundexception 是没有找的类的意思 可能是这个类中有匿名类存在 就是别人不愿意让你知道有这个类存在 因为匿名类没有名字所以反编译不了 这个你就别试了
⑶ 怎么把class文件反编译成java文件
Java中使用eclipse提供的插件对class进行反编译成java文件,如下步骤:
1、安装jadclipse插件
使用jadclipse插件一定要注意Eclipse版本。jadclipse_3.2.4,它对应的是Eclipse3.2版,jadclipse_3.3.0可以用于Eclipse3.3M6以上版。大家千万不要把jadclipse_3.3.0放到Eclipse3.2中,也不要把jadclipse_3.2.4放到Eclipse3.3中,将jadclipse插件(版本自己选择)直接到Eclipse目录中的plugins文件夹下,然后打开Eclipse,选择"窗口"-"首选项"-"常规"-"编辑器"-"文件关联",点击文件关联中的*.class,下面就会看到"JadClipse Class File Viewer",选中它,点击缺省值,点击OK,将它设置为默认的类查看器。如图:

⑷ JAVA匿名类问题
这个问题其实跟匿名类是没有关系的,这个是多态里面的一个问题。子类可以扩展父类,可以定义自己的方法。对于外界来说也是可见的,但是如果你采用的是多态的办法来调用子类那么你的子类中的定义的方法对于外界来说就是不可见的了。只能调用父类中定义过的方法,这样就可以保证安全性。
因为 可能一个类有多个类来继承,每个类都可以定义自己的方法,但是如果可以在父类的对象上边调用子类自己的方法就会存在隐患。比如
public interface A{
public void a();
}
public class B extends A{
public void b(){...}
}
public class C extends A{
public void c(){...}
}
你可以使用A a=new B();
来调用B中方法,但是只能调用 a.a(),而不能调用 a.b();如果说A的对象A可以调用 a.b()的话,那么,如果我把A的实现换成了C那么a.b()就会出现错误,没有这个方法。所以为了保证安全性,父类的对象只能调用父类中定义过的方法。
如果你用过Spring的话,那么就能有比较深的理解。Spring中式可以通过配置来实现多态的,如果java中是可以使用a.b()这样的话,那么你改了Spring中的子类的配置还要去更改代码,那么实际上Spring也就没有多大用处、多态也就没有什么优势了~
不知道你懂了没有~~
⑸ 如何反编译任意文件
一般来说反编译都是针对已知类型,例如exe之类的。
而且世上没有纯粹的新类型文件,都是某人做出来的,不会无缘无故跳出来一个新文件类型。这文件也必然是有源代码,有编译器。如果你没见过这个类型,可以去网上找找,只要找到类型,就有反编译的可能。不过不同类型区别很大。比如vb5.0和6.0只能看到窗体,而c#就可以看到源码。
对未知类型来说,可用ultraedit打开,查看文件头信息,基本可以确定这是一个什么样的文件。
⑹ java 匿名内部类
这个没有使用,只是把 JPanel() 的paintComponent方法重写了下而已。
所谓匿名内部类,就是说本来已经有了个class了,这个class就是和.java文件名字
一样的public的那个class。 然后在这个class里面,有使用了一个只有在这个class里面才能访问到的类,而且直接省略了那个类的名字。好像 think in java里面有段专门讲这个的
⑺ 打扰一下,关于匿名内部类的语法,我一直弄不懂,如下例
匿名内部类顾名思义,是定一个没有名字的内部类。
new WindowAdapter()不是抽象函数,这个语句是定一个匿名内部类的实例,这个匿名内部类是WindowAdapter的子类。后面的{}内是类的定义。使用这种语法,new 后面可以跟接口、抽象类,后面{}内,实现接口、抽象类内必须要实现的方法。
含有匿名内部类的类在编译后,会生成多个class文件,一个是本类的class文件,其他的是匿名内部类的class文件,命名方式是:类名$1.class、类名$2.class......
⑻ 哪位给翻译一下,反编译的带匿名内部类的java文件
本文通过反编译内部类的字节码,
说明了内部类是如何访问外部类对象的成员的,除此之外,
我们也对编译器的行为有了一些了解,
编译器在编译时会自动加上一些逻辑,
这正是我们感觉困惑的原因。
关于内部类如何访问外部类的成员,
分析之后其实也很简单,
主要是通过以下几步做到的:
1
编译器自动为内部类添加一个成员变量,
这个成员变量的类型和外部类的类型相同,
这个成员变量就是指向外部类对象的引用;
2
编译器自动为内部类的构造方法添加一个参数,
参数的类型是外部类的类型,
在构造方法内部使用这个参数为1中添加的成员变量赋值;
3
在调用内部类的构造函数初始化内部类对象时,
会默认传入外部类的引用。
⑼ java 匿名内部类 的执行顺序和文字表述, ,下面看代码
内部类(理解)
(1)把类定义在另一个类的内部,该类就被称为内部类。
举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
A:可以直接访问外部类的成员,包括私有
B:外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
A:成员内部类
B:局部内部类
(4)成员内部类
A:private 为了数据的安全性
B:static 为了访问的方便性
成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
局部内部类
A:局部内部类访问局部变量必须加final修饰。
B:为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
(7)匿名内部类(掌握)
A:是局部内部类的简化形式
B:前提
存在一个类或者接口
C:格式:
new 类名或者接口名() {
重写方法;
}
D:本质:
其实是继承该类或者实现接口的子类匿名对象
(8)匿名内部类在开发中的使用
我们在开发的时候,会看到抽象类,或者接口作为参数。
而这个时候,我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。
⑽ 创建一个匿名类的时候它的位置在哪
你的代码中如果有匿名类,编译器会先处理一下,把它转换成普通的类,名字由编译器起,这样编译器就把匿名类当做普通类去编译了。
这个过程可能是编译时直接在内存中展开的。
一般是在匿名类所在的当前类里面,这样才能够访问当前类的成员。
如果是C#,用dnspy反编译一个带匿名类的dll或者exe就看到编译器展开的结果了。
