< prev index next >

src/java.base/share/classes/jdk/internal/reflect/NativeConstructorAccessorImpl.java

Print this page

34 class NativeConstructorAccessorImpl extends ConstructorAccessorImpl {
35     private static final Unsafe U = Unsafe.getUnsafe();
36     private static final long GENERATED_OFFSET
37         = U.objectFieldOffset(NativeConstructorAccessorImpl.class, "generated");
38 
39     private final Constructor<?> c;
40     private final DelegatingConstructorAccessorImpl parent;
41     private int numInvocations;
42     private volatile int generated;
43 
44     NativeConstructorAccessorImpl(Constructor<?> c) {
45         this.c = c;
46         this.parent = new DelegatingConstructorAccessorImpl(this);
47     }
48 
49     public Object newInstance(Object[] args)
50         throws InstantiationException,
51                IllegalArgumentException,
52                InvocationTargetException
53     {
54         // We can't inflate a constructor belonging to a vm-anonymous class
55         // because that kind of class can't be referred to by name, hence can't
56         // be found from the generated bytecode.
57         if (++numInvocations > ReflectionFactory.inflationThreshold()
58                 && !c.getDeclaringClass().isHidden()
59                 && generated == 0
60                 && U.compareAndSetInt(this, GENERATED_OFFSET, 0, 1)) {
61             try {
62                 ConstructorAccessorImpl acc = (ConstructorAccessorImpl)
63                     new MethodAccessorGenerator().
64                         generateConstructor(c.getDeclaringClass(),
65                                             c.getParameterTypes(),
66                                             c.getExceptionTypes(),
67                                             c.getModifiers());
68                 parent.setDelegate(acc);
69             } catch (Throwable t) {
70                 // Throwable happens in generateConstructor, restore generated to 0
71                 generated = 0;
72                 throw t;
73             }
74         }

34 class NativeConstructorAccessorImpl extends ConstructorAccessorImpl {
35     private static final Unsafe U = Unsafe.getUnsafe();
36     private static final long GENERATED_OFFSET
37         = U.objectFieldOffset(NativeConstructorAccessorImpl.class, "generated");
38 
39     private final Constructor<?> c;
40     private final DelegatingConstructorAccessorImpl parent;
41     private int numInvocations;
42     private volatile int generated;
43 
44     NativeConstructorAccessorImpl(Constructor<?> c) {
45         this.c = c;
46         this.parent = new DelegatingConstructorAccessorImpl(this);
47     }
48 
49     public Object newInstance(Object[] args)
50         throws InstantiationException,
51                IllegalArgumentException,
52                InvocationTargetException
53     {
54         // We can't inflate a constructor belonging to a hidden class
55         // because that kind of class can't be referred to by name, hence can't
56         // be found from the generated bytecode.
57         if (++numInvocations > ReflectionFactory.inflationThreshold()
58                 && !c.getDeclaringClass().isHidden()
59                 && generated == 0
60                 && U.compareAndSetInt(this, GENERATED_OFFSET, 0, 1)) {
61             try {
62                 ConstructorAccessorImpl acc = (ConstructorAccessorImpl)
63                     new MethodAccessorGenerator().
64                         generateConstructor(c.getDeclaringClass(),
65                                             c.getParameterTypes(),
66                                             c.getExceptionTypes(),
67                                             c.getModifiers());
68                 parent.setDelegate(acc);
69             } catch (Throwable t) {
70                 // Throwable happens in generateConstructor, restore generated to 0
71                 generated = 0;
72                 throw t;
73             }
74         }
< prev index next >