我在另一个类(SomeClass)中有一个匿名内部类。
双方SomeClass.class.getClasses()并SomeClass.class.getDeclaredClasses()返回空数组。
我在ClassJavadocs中找不到关于此的一些提示。
可以使用反射以某种方式检索匿名内部类吗?
匿名内部类和普通内部类之间还有什么显着区别?
我最近使用这个代码,并意识到在匿名类中,我无法通过.this访问该实例,如下所示:
Sprite sprFace = new Sprite() {
@Override
protected void onManagedUpdate(float pSecondElapsed) {
runOnUpdateThread(new Runnable() {
@Override
protected void run() {
Sprite.this.getParent().detach(Sprite.this); // Here
}});
}
};
Run Code Online (Sandbox Code Playgroud)
我知道如何解决它(只是声明一个"我"变量),但我需要知道为什么我不能使用<Class>.this?
或者简单地说
我能做点什么吗
class A {
public:
virtual void foo() = 0;
};
class B {
public:
A *a;
b(){
a = new A() { void foo() {printf("hello");}
}
};
Run Code Online (Sandbox Code Playgroud) 从android开发的角度来看,在编程时,您更喜欢为侦听器实现哪种方式?还是您认为哪种方式最适合可读代码?我给出了关于这些事情的两个示例,但是认为更复杂的类(例如,具有多个Listener的类):
第一个示例是匿名类:
public class SenderReceiverActivity extends Activity {
Button cancelButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sending);
cancelButton = (Button) findViewById(R.id.button1);
cancelButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
}
});
}}
Run Code Online (Sandbox Code Playgroud)
第二个例子是实现接口:
public class SenderReceiverActivity extends Activity implements OnClickListener {
Button cancelButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sending);
cancelButton = (Button) findViewById(R.id.button1);
cancelButton.setOnClickListener(this);
}
public void onClick(View v) {
}
}
Run Code Online (Sandbox Code Playgroud) 现在我得到一些如下的日志(log-1)
java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to ClassA$1
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1010)
...
Run Code Online (Sandbox Code Playgroud)
1010行
final LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) obj.method();//line 1010
Run Code Online (Sandbox Code Playgroud)
我想,日志应该是这样的(log-2)
java.lang.ClassCastException: ClassA$1 cannot be cast to android.widget.LinearLayout$LayoutParams
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我会得到log-1,是不是?
如果log-1是正确的,那么我如何编写代码来创建这样的异常?
ps:我知道ClassA $ 1是一个匿名类.
ps:我在猴子测试中得到了这个日志,而且很难重新出现
有人告诉我:
MyInterface my = ClassA$1;//$1 is an anonymous class which implements MyInterface
my.getClass().cast(lp);
Run Code Online (Sandbox Code Playgroud)
那么日志就像log-1
但为什么日志没有指出"cast"方法行?
我检查文件夹框架/ base/core,没有人调用方法"?java.lang.Class.cast(Object obj)"的
任何想法?
public class Main {
private final int value = 3;
public static Runnable buildRunner() {
return new Runnable() {
@Override
public void run() {
System.out.println(Main.this.value);
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Eclipse Kepler和JRE 7.
在buildRunner方法中 - 为什么我能看到thisMain的?静态方法中Main的'this'是什么?为什么编译?
如果value是最终的,我只能这样做.我不能调用Main和stuff的实例方法,但是值不是十分贬值的static!此外,如果我想在使用buildRunner方法,外面run的方法new Runnable,编译器将停止从我做那.
我想了解一个我在处理匿名课程时遇到的奇怪行为.
我有一个类在其构造函数中调用受保护的方法(我知道,设计很差,但这是另一个故事...)
public class A {
public A() {
init();
}
protected void init() {}
}
Run Code Online (Sandbox Code Playgroud)
然后我有另一个扩展A和覆盖的类init().
public class B extends A {
int value;
public B(int i) {
value = i;
}
protected void init() {
System.out.println("value="+value);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我编码
B b = new B(10);
Run Code Online (Sandbox Code Playgroud)
我明白了
> value=0
Run Code Online (Sandbox Code Playgroud)
这是预期的,因为超级类的构造函数在Bctor 之前调用然后value仍然是.
但是在使用像这样的匿名类时
class C {
public static void main (String[] args) {
final int avalue = Integer.parsetInt(args[0]);
A a = new A() …Run Code Online (Sandbox Code Playgroud) 如何检查列表中的下一个元素是否为空?
while(it.hasNext()){
System.out.println(it.next()+"\n");
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试的方式,但是当最后一个元素为null时,它将其打印为null.
我试着改变它
while(it.hasNext()){
if(it.next()==null){
}else
System.out.println(it.next()+"\n");
}
Run Code Online (Sandbox Code Playgroud)
但这只是让它变得更糟,因为有些元素甚至不打印!
这是我的迭代方法/匿名类
public Iterator<Filmi> iterator3DFilms ()throws FilmiException{
if(filmList.isEmpty())
throw new FilmiException("No Films on the list");
return new Iterator<Filmi>(){
private int index=0;
public boolean hasNext(){
return index <filmList.size();
}
public Filmi next(){
Filmi lb = filmList.get(index++);
if(lb.is3D()== true)
return lb;
if(hasNext())
return next();
return null;
}
public void remove(){}
};
}
Run Code Online (Sandbox Code Playgroud)
空打印只发生在最后一个元素谢谢.
匿名类的目的是明确和可以理解的。但是我找不到支持匿名类的Java的最低版本。谁能告诉我支持它的确切Java版本?
在一个Android项目中,我尝试使用Java 8的新lambda功能,因此我将现有的可运行功能的匿名内部类修改为lambda。但是,使用以下错误消息执行代码时,应用程序崩溃:
11-25 11:20:33.485 27105-27105/com.infor.Dashboards.dev E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.infor.Dashboards.dev, PID: 27105
java.lang.VerifyError: Verifier rejected class com.infor.Dashboards.Settings.DebugTestingFragment$3$1$$Lambda$-void_onPostExecute_java_lang_String_string_LambdaImpl0 due to bad method void com.infor.Dashboards.Settings.DebugTestingFragment$3$1$$Lambda$-void_onPostExecute_java_lang_String_string_LambdaImpl0.processMessage(android.os.Message) (declaration of 'com.infor.Dashboards.Settings.DebugTestingFragment$3$1$$Lambda$-void_onPostExecute_java_lang_String_string_LambdaImpl0' appears in /data/app/com.infor.Dashboards.dev-1/base.apk)
at com.infor.Dashboards.Settings.DebugTestingFragment$3$1.onPostExecute(DebugTestingFragment.java:308)
at com.infor.Dashboards.Settings.DebugTestingFragment$3$1.onPostExecute(DebugTestingFragment.java:304)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5460)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Run Code Online (Sandbox Code Playgroud)
这是示例代码(单击按钮时应用崩溃):
view.findViewById(R.id.test_code).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new AsyncTask<Void, Void, String>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void …Run Code Online (Sandbox Code Playgroud)