| // Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| package com.android.tools.r8.compatproguard; |
| |
| import com.android.tools.r8.NeverInline; |
| |
| public class CompatKeepClassMemberNamesTest { |
| |
| public static class Bar { |
| |
| public int i = 42; |
| |
| @NeverInline |
| public static Bar instance() { |
| throw new RuntimeException(); |
| } |
| } |
| |
| public static void main(String[] args) throws Exception { |
| String junk = args.length > 0 ? "!" : ""; |
| // Ensure a non-instance reference to class Bar. |
| Bar barReference = args.length > 0 ? Bar.instance() : null; |
| // Reflectively construct bar and access its field while adding junk to ensure the reflection |
| // is not identified. |
| Object barObject = |
| Class.forName(CompatKeepClassMemberNamesTest.class.getName() + "$B" + junk + "ar") |
| .getDeclaredConstructor() |
| .newInstance(); |
| int fieldValue = barObject.getClass().getDeclaredField(junk + "i").getInt(barObject); |
| // Make sure the values cannot be eliminated. |
| System.out.println(fieldValue); |
| System.out.println(barReference); |
| } |
| } |