From: Alex Light Date: Mon, 8 Feb 2016 18:30:04 +0000 (-0800) Subject: Default methods should not be found by getDeclaredMethod X-Git-Tag: android-x86-7.1-r1~418 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=3b7027e26106e7bfaa2bfae0f24489372f7ddbf0;p=android-x86%2Fart.git Default methods should not be found by getDeclaredMethod (cherrypick commit 64fdc804f6b4d8a6f7d86bd9672e3bb1cde7056f) Bug: 27060609 Change-Id: I77337f5d4c6bb9dd14f57012a9daa1e56a760f1a --- diff --git a/runtime/native/java_lang_Class.cc b/runtime/native/java_lang_Class.cc index a80585abc..b5d859b6b 100644 --- a/runtime/native/java_lang_Class.cc +++ b/runtime/native/java_lang_Class.cc @@ -388,7 +388,7 @@ static jobject Class_getDeclaredMethodInternal(JNIEnv* env, jobject javaThis, auto h_args = hs.NewHandle(soa.Decode*>(args)); Handle h_klass = hs.NewHandle(DecodeClass(soa, javaThis)); ArtMethod* result = nullptr; - for (auto& m : h_klass->GetVirtualMethods(sizeof(void*))) { + for (auto& m : h_klass->GetDeclaredVirtualMethods(sizeof(void*))) { auto* np_method = m.GetInterfaceMethodIfProxy(sizeof(void*)); // May cause thread suspension. mirror::String* np_name = np_method->GetNameAsString(soa.Self()); diff --git a/test/048-reflect-v8/expected.txt b/test/048-reflect-v8/expected.txt index 3109eccda..54aede9a7 100644 --- a/test/048-reflect-v8/expected.txt +++ b/test/048-reflect-v8/expected.txt @@ -6,6 +6,15 @@ IsDefaultTest$RegularInterface is default = no IsDefaultTest$ImplementsWithDefault is default = yes IsDefaultTest$ImplementsWithRegular is default = no ============================== +Are These Methods found by getDeclaredMethod: +============================== +No error thrown for class interface DefaultDeclared$DefaultInterface +No error thrown for class interface DefaultDeclared$RegularInterface +NoSuchMethodException thrown for class class DefaultDeclared$ImplementsWithDefault +No error thrown for class class DefaultDeclared$ImplementsWithDeclared +No error thrown for class class DefaultDeclared$ImplementsWithRegular +NoSuchMethodException thrown for class class DefaultDeclared$UnimplementedWithRegular +============================== Class annotations by type: ============================== Annotations by type, defined by class SingleUser with annotation Calendar: @Calendar(dayOfMonth=unspecified_month, dayOfWeek=single, hour=23) diff --git a/test/048-reflect-v8/src/DefaultDeclared.java b/test/048-reflect-v8/src/DefaultDeclared.java new file mode 100644 index 000000000..16e8a24c0 --- /dev/null +++ b/test/048-reflect-v8/src/DefaultDeclared.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.lang.reflect.Method; + +public class DefaultDeclared { + interface DefaultInterface { + default void sayHi() { + System.out.println("hi default"); + } + } + + interface RegularInterface { + void sayHi(); + } + + class ImplementsWithDefault implements DefaultInterface {} + + class ImplementsWithDeclared implements DefaultInterface { + public void sayHi() { + System.out.println("hello specific from default"); + } + } + + abstract class UnimplementedWithRegular implements RegularInterface { } + + class ImplementsWithRegular implements RegularInterface { + public void sayHi() { + System.out.println("hello specific"); + } + } + + private static void printGetMethod(Class klass) { + Method m; + try { + m = klass.getDeclaredMethod("sayHi"); + System.out.println("No error thrown for class " + klass.toString()); + } catch (NoSuchMethodException e) { + System.out.println("NoSuchMethodException thrown for class " + klass.toString()); + } catch (Throwable t) { + System.out.println("Unknown error thrown for class " + klass.toString()); + t.printStackTrace(); + } + } + + public static void test() { + System.out.println("=============================="); + System.out.println("Are These Methods found by getDeclaredMethod:"); + System.out.println("=============================="); + + printGetMethod(DefaultInterface.class); + printGetMethod(RegularInterface.class); + printGetMethod(ImplementsWithDefault.class); + printGetMethod(ImplementsWithDeclared.class); + printGetMethod(ImplementsWithRegular.class); + printGetMethod(UnimplementedWithRegular.class); + } +} diff --git a/test/048-reflect-v8/src/Main.java b/test/048-reflect-v8/src/Main.java index f2b8287d1..b270e6828 100644 --- a/test/048-reflect-v8/src/Main.java +++ b/test/048-reflect-v8/src/Main.java @@ -17,6 +17,7 @@ public class Main { public static void main(String[] args) { IsDefaultTest.test(); + DefaultDeclared.test(); AnnotationTest.testAnnotationsByType(); AnnotationTest.testDeclaredAnnotation(); AnnotationTest.testDeclaredAnnotationsByType();