| // Copyright (c) 2023, 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 records; |
| |
| import java.lang.annotation.ElementType; |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| import java.lang.annotation.Target; |
| import java.lang.reflect.Field; |
| import java.lang.reflect.RecordComponent; |
| import java.util.ArrayList; |
| import java.util.Comparator; |
| import java.util.List; |
| |
| public class RecordWithAnnotations { |
| |
| @Target({ElementType.FIELD, ElementType.RECORD_COMPONENT}) |
| @Retention(RetentionPolicy.RUNTIME) |
| @interface Annotation { |
| String value(); |
| } |
| |
| @Target(ElementType.FIELD) |
| @Retention(RetentionPolicy.RUNTIME) |
| @interface AnnotationFieldOnly { |
| String value(); |
| } |
| |
| @Target(ElementType.RECORD_COMPONENT) |
| @Retention(RetentionPolicy.RUNTIME) |
| @interface AnnotationRecordComponentOnly { |
| String value(); |
| } |
| |
| record Person( |
| @Annotation("a") @AnnotationFieldOnly("b") @AnnotationRecordComponentOnly("c") String name, |
| @Annotation("x") @AnnotationFieldOnly("y") @AnnotationRecordComponentOnly("z") int age) {} |
| |
| public static void main(String[] args) { |
| Person janeDoe = new Person("Jane Doe", 42); |
| System.out.println(janeDoe.name); |
| System.out.println(janeDoe.age); |
| System.out.println(janeDoe.name()); |
| System.out.println(janeDoe.age()); |
| try { |
| Class.class.getDeclaredMethod("isRecord"); |
| } catch (NoSuchMethodException e) { |
| System.out.println("Class.isRecord not present"); |
| return; |
| } |
| System.out.println(Person.class.isRecord()); |
| if (Person.class.isRecord()) { |
| System.out.println(Person.class.getRecordComponents().length); |
| for (int i = 0; i < Person.class.getRecordComponents().length; i++) { |
| RecordComponent c = Person.class.getRecordComponents()[i]; |
| System.out.println(c.getName()); |
| System.out.println(c.getType().getName()); |
| System.out.println(c.getGenericSignature() == null); |
| System.out.println(c.getAnnotations().length); |
| // Collect and sort the annotations, as the order is not deterministic on Art (tested |
| // on Art 14 Beta 3). |
| List<String> annotations = new ArrayList<>(); |
| for (int j = 0; j < c.getAnnotations().length; j++) { |
| annotations.add(c.getAnnotations()[j].toString()); |
| } |
| annotations.sort(Comparator.naturalOrder()); |
| for (int j = 0; j < annotations.size(); j++) { |
| System.out.println(annotations.get(j)); |
| } |
| } |
| System.out.println(Person.class.getDeclaredFields().length); |
| List<Field> fields = new ArrayList<>(); |
| for (int i = 0; i < Person.class.getDeclaredFields().length; i++) { |
| fields.add(Person.class.getDeclaredFields()[i]); |
| } |
| fields.sort( |
| new Comparator<Field>() { |
| @Override |
| public int compare(Field o1, Field o2) { |
| return o1.getName().compareTo(o2.getName()); |
| } |
| }); |
| for (int i = 0; i < fields.size(); i++) { |
| Field f = fields.get(i); |
| System.out.println(f.getDeclaredAnnotations().length); |
| List<String> annotations = new ArrayList<>(); |
| for (int j = 0; j < f.getDeclaredAnnotations().length; j++) { |
| annotations.add(f.getAnnotations()[j].toString()); |
| } |
| annotations.sort(Comparator.naturalOrder()); |
| for (int j = 0; j < annotations.size(); j++) { |
| System.out.println(annotations.get(j)); |
| } |
| } |
| } |
| } |
| } |