12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/*
22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2006 The Android Open Source Project
32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License.
62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at
72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes *
102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software
112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and
142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License.
152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */
165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.lang.reflect.*;
185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.io.IOException;
195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoimport java.util.Collections;
20741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughesimport java.util.ArrayList;
2168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebskiimport java.util.Arrays;
22741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughesimport java.util.List;
23741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughesimport java.util.Map;
2468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebskiimport java.util.Set;
255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao/**
275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao * Reflection test.
285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao */
295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaopublic class Main {
30741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    private static boolean FULL_ACCESS_CHECKS = false;  // b/5861201
31741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    public Main() {}
32741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    public Main(ArrayList<Integer> stuff) {}
33741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    void printMethodInfo(Method meth) {
355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Class[] params, exceptions;
365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        int i;
375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("Method name is " + meth.getName());
395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println(" Declaring class is "
405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            + meth.getDeclaringClass().getName());
415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        params = meth.getParameterTypes();
425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        for (i = 0; i < params.length; i++)
435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println(" Arg " + i + ": " + params[i].getName());
445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        exceptions = meth.getExceptionTypes();
455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        for (i = 0; i < exceptions.length; i++)
465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println(" Exc " + i + ": " + exceptions[i].getName());
475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println(" Return type is " + meth.getReturnType().getName());
485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println(" Access flags are 0x"
495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            + Integer.toHexString(meth.getModifiers()));
505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        //System.out.println(" GenericStr is " + meth.toGenericString());
515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    void printFieldInfo(Field field) {
545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("Field name is " + field.getName());
555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println(" Declaring class is "
565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            + field.getDeclaringClass().getName());
575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println(" Field type is " + field.getType().getName());
585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println(" Access flags are 0x"
595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            + Integer.toHexString(field.getModifiers()));
605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private void showStrings(Target instance)
635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        throws NoSuchFieldException, IllegalAccessException {
645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Class target = Target.class;
665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        String one, two, three, four;
675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Field field = null;
685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        field = target.getField("string1");
705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        one = (String) field.get(instance);
715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        field = target.getField("string2");
735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        two = (String) field.get(instance);
745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        field = target.getField("string3");
765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        three = (String) field.get(instance);
775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("  ::: " + one + ":" + two + ":" + three);
795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
81741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    public static void checkAccess() {
82741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        try {
83741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            Class target = otherpackage.Other.class;
84741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            Object instance = new otherpackage.Other();
85741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            Method meth;
86741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
87741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            meth = target.getMethod("publicMethod", (Class[]) null);
88741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            meth.invoke(instance);
89741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
90741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            try {
91741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                meth = target.getMethod("packageMethod", (Class[]) null);
92741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                System.err.println("succeeded on package-scope method");
93741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            } catch (NoSuchMethodException nsme) {
94741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                // good
95741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            }
96741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
97741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
98741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            instance = otherpackage.Other.getInnerClassInstance();
99741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            target = instance.getClass();
100741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            meth = target.getMethod("innerMethod", (Class[]) null);
101741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            try {
102741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                if (!FULL_ACCESS_CHECKS) { throw new IllegalAccessException(); }
103741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                meth.invoke(instance);
104741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                System.err.println("inner-method invoke unexpectedly worked");
105741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            } catch (IllegalAccessException iae) {
106741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                // good
107741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            }
108741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
109741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            Field field = target.getField("innerField");
110741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            try {
111741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                int x = field.getInt(instance);
112741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                if (!FULL_ACCESS_CHECKS) { throw new IllegalAccessException(); }
113741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                System.err.println("field get unexpectedly worked: " + x);
114741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            } catch (IllegalAccessException iae) {
115741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                // good
116741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            }
117741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        } catch (Exception ex) {
118741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            System.out.println("----- unexpected exception -----");
119741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            ex.printStackTrace();
120741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        }
121741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    }
122741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
1235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void run() {
1245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Class target = Target.class;
1255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Method meth = null;
1265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Field field = null;
1275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        boolean excep;
1285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
1305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            meth = target.getMethod("myMethod", new Class[] { int.class });
1315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (meth.getDeclaringClass() != target)
1335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new RuntimeException();
1345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printMethodInfo(meth);
1355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            meth = target.getMethod("myMethod", new Class[] { float.class });
1375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printMethodInfo(meth);
1385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            meth = target.getMethod("myNoargMethod", (Class[]) null);
1405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printMethodInfo(meth);
1415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            meth = target.getMethod("myMethod",
1435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                new Class[] { String[].class, float.class, char.class });
1445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printMethodInfo(meth);
1455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            Target instance = new Target();
1475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            Object[] argList = new Object[] {
1485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                new String[] { "hi there" },
1495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                new Float(3.1415926f),
150af50e415a187190488d4694f307c23705203c53eFredrik Roubert                new Character('\u2714')
1515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            };
1525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Before, float is "
1535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                + ((Float)argList[1]).floatValue());
1545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            Integer boxval;
1565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            boxval = (Integer) meth.invoke(instance, argList);
1575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Result of invoke: " + boxval.intValue());
1585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("Calling no-arg void-return method");
1605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            meth = target.getMethod("myNoargMethod", (Class[]) null);
1615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            meth.invoke(instance, (Object[]) null);
1625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            /* try invoking a method that throws an exception */
1645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            meth = target.getMethod("throwingMethod", (Class[]) null);
1655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
1665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                meth.invoke(instance, (Object[]) null);
1675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("GLITCH: didn't throw");
1685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            } catch (InvocationTargetException ite) {
1695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("Invoke got expected exception:");
1705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println(ite.getClass().getName());
1715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println(ite.getCause());
1725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
1735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (Exception ex) {
1745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("GLITCH: invoke got wrong exception:");
1755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                ex.printStackTrace();
1765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
1775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("");
1785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getField("string1");
1815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (field.getDeclaringClass() != target)
1825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new RuntimeException();
1835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printFieldInfo(field);
1845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            String strVal = (String) field.get(instance);
1855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  string1 value is '" + strVal + "'");
1865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            showStrings(instance);
1885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.set(instance, new String("a new string"));
1905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            strVal = (String) field.get(instance);
1915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  string1 value is now '" + strVal + "'");
1925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            showStrings(instance);
1945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
1955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
1965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field.set(instance, new Object());
1975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("WARNING: able to store Object into String");
1985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
1995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalArgumentException iae) {
2005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected illegal obj store exc");
2015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
2055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                String four;
2065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field = target.getField("string4");
2075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                four = (String) field.get(instance);
2085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("WARNING: able to access string4: "
2095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    + four);
2105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalAccessException iae) {
2125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected access exc");
2135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (NoSuchFieldException nsfe) {
2155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got the other expected access exc");
2165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
2185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                String three;
2195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field = target.getField("string3");
2205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                three = (String) field.get(this);
2215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("WARNING: able to get string3 in wrong obj: "
2225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                    + three);
2235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalArgumentException iae) {
2255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected arg exc");
2265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            /*
2295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao             * Try setting a field to null.
2305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao             */
2315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            String four;
2325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getDeclaredField("string3");
2335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.set(instance, null);
2345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            /*
2363beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier             * Try getDeclaredField on a non-existant field.
2373beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier             */
2383beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier            try {
2393beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier                field = target.getDeclaredField("nonExistant");
2403beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier                System.out.println("ERROR: Expected NoSuchFieldException");
2413beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier            } catch (NoSuchFieldException nsfe) {
2423beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier                String msg = nsfe.getMessage();
2433beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier                if (!msg.contains("Target;")) {
2443beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier                    System.out.println("  NoSuchFieldException '" + msg +
2453beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier                        "' didn't contain class");
2463beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier                }
2473beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier            }
2483beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier
2493beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier            /*
2505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao             * Do some stuff with long.
2515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao             */
2525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            long longVal;
2535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getField("pubLong");
2545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            longVal = field.getLong(instance);
2555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("pubLong initial value is " +
2565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                Long.toHexString(longVal));
2575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.setLong(instance, 0x9988776655443322L);
2585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            longVal = field.getLong(instance);
2595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("pubLong new value is " +
2605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                Long.toHexString(longVal));
2615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getField("superInt");
2645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (field.getDeclaringClass() == target)
2655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                throw new RuntimeException();
2665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printFieldInfo(field);
2675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            int intVal = field.getInt(instance);
2685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  superInt value is " + intVal);
2695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            Integer boxedIntVal = (Integer) field.get(instance);
2705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  superInt boxed is " + boxedIntVal);
2715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
2725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.set(instance, new Integer(20202));
2735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            intVal = field.getInt(instance);
2745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  superInt value is now " + intVal);
2755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.setShort(instance, (short)30303);
2765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            intVal = field.getInt(instance);
2775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  superInt value (from short) is now " +intVal);
2785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.setInt(instance, 40404);
2795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            intVal = field.getInt(instance);
2805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  superInt value is now " + intVal);
2815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
2825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field.set(instance, new Long(123));
2835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("FAIL: expected exception not thrown");
2845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalArgumentException iae) {
2865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected long->int failure");
2875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
2895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field.setLong(instance, 123);
2905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("FAIL: expected exception not thrown");
2915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalArgumentException iae) {
2935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected long->int failure");
2945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
2965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field.set(instance, new String("abc"));
2975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("FAIL: expected exception not thrown");
2985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
2995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalArgumentException iae) {
3005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected string->int failure");
3015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
3045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field.getShort(instance);
3055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("FAIL: expected exception not thrown");
3065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalArgumentException iae) {
3085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected int->short failure");
3095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getField("superClassInt");
3125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printFieldInfo(field);
3135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            int superClassIntVal = field.getInt(instance);
3145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  superClassInt value is " + superClassIntVal);
3155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getField("staticDouble");
3175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printFieldInfo(field);
3185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            double staticDoubleVal = field.getDouble(null);
3195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  staticDoubleVal value is " + staticDoubleVal);
3205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
3225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field.getLong(instance);
3235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("FAIL: expected exception not thrown");
3245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (IllegalArgumentException iae) {
3265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("  got expected double->long failure");
3275d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3285d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3295d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            excep = false;
3305d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
3315d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field = target.getField("aPrivateInt");
3325d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                printFieldInfo(field);
3335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            catch (NoSuchFieldException nsfe) {
3355d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("as expected: aPrivateInt not found");
3365d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                excep = true;
3375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            if (!excep)
3395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                System.out.println("BUG: got aPrivateInt");
3405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getField("constantString");
3435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printFieldInfo(field);
3445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            String val = (String) field.get(instance);
3455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  Constant test value is " + val);
3465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3475d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3485d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field = target.getField("cantTouchThis");
3495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            printFieldInfo(field);
3505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            intVal = field.getInt(instance);
3515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  cantTouchThis is " + intVal);
3525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            try {
3535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao                field.setInt(instance, 99);
35411d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao                System.out.println("ERROR: set-final did not throw exception");
3555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            } catch (IllegalAccessException iae) {
35611d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao                System.out.println("  as expected: set-final throws exception");
3575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            }
3585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            intVal = field.getInt(instance);
35911d5d8fffe41cc7daadbfa2ca98ecb978f3029afJeff Hao            System.out.println("  cantTouchThis is still " + intVal);
3605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
361ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("  " + field + " accessible=" + field.isAccessible());
3625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.setAccessible(true);
363ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("  " + field + " accessible=" + field.isAccessible());
3645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.setInt(instance, 87);     // exercise int version
365582a7d16bb0db323d8bd730beb61578aa3765f43Elliott Hughes            intVal = field.getInt(instance);
366582a7d16bb0db323d8bd730beb61578aa3765f43Elliott Hughes            System.out.println("  cantTouchThis is now " + intVal);
3675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            field.set(instance, 88);        // exercise Object version
3685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            intVal = field.getInt(instance);
3695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("  cantTouchThis is now " + intVal);
3705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            Constructor<Target> cons;
3725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            Target targ;
3735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            Object[] args;
3745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
3755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            cons = target.getConstructor(new Class[] { int.class,float.class });
3765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            args = new Object[] { new Integer(7), new Float(3.3333) };
3775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("cons modifiers=" + cons.getModifiers());
3785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            targ = cons.newInstance(args);
3795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            targ.myMethod(17);
3805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
38163f5b9e8f660ae761901072821ece30d87891644Jeff Hao            try {
38263f5b9e8f660ae761901072821ece30d87891644Jeff Hao                Thrower thrower = Thrower.class.newInstance();
38363f5b9e8f660ae761901072821ece30d87891644Jeff Hao                System.out.println("ERROR: Class.newInstance did not throw exception");
38463f5b9e8f660ae761901072821ece30d87891644Jeff Hao            } catch (UnsupportedOperationException uoe) {
38563f5b9e8f660ae761901072821ece30d87891644Jeff Hao                System.out.println("got expected exception for Class.newInstance");
38663f5b9e8f660ae761901072821ece30d87891644Jeff Hao            } catch (Exception e) {
38763f5b9e8f660ae761901072821ece30d87891644Jeff Hao                System.out.println("ERROR: Class.newInstance got unexpected exception: " +
38863f5b9e8f660ae761901072821ece30d87891644Jeff Hao                                   e.getClass().getName());
38963f5b9e8f660ae761901072821ece30d87891644Jeff Hao            }
39063f5b9e8f660ae761901072821ece30d87891644Jeff Hao
39163f5b9e8f660ae761901072821ece30d87891644Jeff Hao            try {
39263f5b9e8f660ae761901072821ece30d87891644Jeff Hao                Constructor<Thrower> constructor = Thrower.class.getDeclaredConstructor();
39363f5b9e8f660ae761901072821ece30d87891644Jeff Hao                Thrower thrower = constructor.newInstance();
39463f5b9e8f660ae761901072821ece30d87891644Jeff Hao                System.out.println("ERROR: Constructor.newInstance did not throw exception");
39563f5b9e8f660ae761901072821ece30d87891644Jeff Hao            } catch (InvocationTargetException ite) {
39663f5b9e8f660ae761901072821ece30d87891644Jeff Hao                System.out.println("got expected exception for Constructor.newInstance");
39763f5b9e8f660ae761901072821ece30d87891644Jeff Hao            } catch (Exception e) {
39863f5b9e8f660ae761901072821ece30d87891644Jeff Hao                System.out.println("ERROR: Constructor.newInstance got unexpected exception: " +
39963f5b9e8f660ae761901072821ece30d87891644Jeff Hao                                   e.getClass().getName());
40063f5b9e8f660ae761901072821ece30d87891644Jeff Hao            }
40163f5b9e8f660ae761901072821ece30d87891644Jeff Hao
402741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        } catch (Exception ex) {
4035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("----- unexpected exception -----");
4045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            ex.printStackTrace();
4055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
4065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
4075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("ReflectTest done!");
4085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
4095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
4103778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath    public static void checkSwap() {
4115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Method m;
4125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
4133778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath        final Object[] objects = new Object[2];
4145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
4153778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            m = Collections.class.getDeclaredMethod("swap",
4163778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath                            Object[].class, int.class, int.class);
4175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (NoSuchMethodException nsme) {
4185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            nsme.printStackTrace();
4195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            return;
4205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
421ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        System.out.println(m + " accessible=" + m.isAccessible());
4225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        m.setAccessible(true);
423ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        System.out.println(m + " accessible=" + m.isAccessible());
4245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
4253778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            m.invoke(null, objects, 0, 1);
4267a549467e332398229724058c07d998d0acfb0bbJeff Hao        } catch (IllegalAccessException iae) {
4277a549467e332398229724058c07d998d0acfb0bbJeff Hao            iae.printStackTrace();
4287a549467e332398229724058c07d998d0acfb0bbJeff Hao            return;
4297a549467e332398229724058c07d998d0acfb0bbJeff Hao        } catch (InvocationTargetException ite) {
4307a549467e332398229724058c07d998d0acfb0bbJeff Hao            ite.printStackTrace();
4317a549467e332398229724058c07d998d0acfb0bbJeff Hao            return;
4327a549467e332398229724058c07d998d0acfb0bbJeff Hao        }
4337a549467e332398229724058c07d998d0acfb0bbJeff Hao
4347a549467e332398229724058c07d998d0acfb0bbJeff Hao        try {
4357a549467e332398229724058c07d998d0acfb0bbJeff Hao            String s = "Should be ignored";
4363778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            m.invoke(s, objects, 0, 1);
4375d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (IllegalAccessException iae) {
4385d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            iae.printStackTrace();
4395d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            return;
4405d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (InvocationTargetException ite) {
4415d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            ite.printStackTrace();
4425d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            return;
4435d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
4445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
4455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        try {
4465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("checkType invoking null");
4473778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            // Trigger an NPE at the target.
4483778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            m.invoke(null, null, 0, 1);
4495d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("ERROR: should throw InvocationTargetException");
4505d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (InvocationTargetException ite) {
4515d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            System.out.println("checkType got expected exception");
4525d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        } catch (IllegalAccessException iae) {
4535d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            iae.printStackTrace();
4545d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            return;
4555d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        }
4565d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
4575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
458923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes    public static void checkClinitForFields() throws Exception {
459923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      // Loading a class constant shouldn't run <clinit>.
460923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("calling const-class FieldNoisyInitUser.class");
461923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      Class niuClass = FieldNoisyInitUser.class;
462923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("called const-class FieldNoisyInitUser.class");
463923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
464923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      // Getting the declared fields doesn't run <clinit>.
465923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      Field[] fields = niuClass.getDeclaredFields();
466923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("got fields");
467923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
468923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      Field field = niuClass.getField("staticField");
469923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("got field");
470923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      field.get(null);
471923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("read field value");
472923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
473923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      // FieldNoisyInitUser should now be initialized, but FieldNoisyInit shouldn't be initialized yet.
474923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      FieldNoisyInitUser niu = new FieldNoisyInitUser();
475923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      FieldNoisyInit ni = new FieldNoisyInit();
476923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
477923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("");
478923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes    }
479923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
480923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes    public static void checkClinitForMethods() throws Exception {
481923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      // Loading a class constant shouldn't run <clinit>.
482923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("calling const-class MethodNoisyInitUser.class");
483923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      Class niuClass = MethodNoisyInitUser.class;
484923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("called const-class MethodNoisyInitUser.class");
485923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
486923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      // Getting the declared methods doesn't run <clinit>.
487923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      Method[] methods = niuClass.getDeclaredMethods();
488923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("got methods");
489923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
490923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      Method method = niuClass.getMethod("staticMethod", (Class[]) null);
491923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("got method");
492923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      method.invoke(null);
493923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("invoked method");
494923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
495923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      // MethodNoisyInitUser should now be initialized, but MethodNoisyInit shouldn't be initialized yet.
496923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      MethodNoisyInitUser niu = new MethodNoisyInitUser();
497923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      MethodNoisyInit ni = new MethodNoisyInit();
498923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
499923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes      System.out.println("");
500741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    }
501741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
502741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
503741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    /*
504741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes     * Test some generic type stuff.
505741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes     */
506741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    public List<String> dummy;
507741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    public Map<Integer,String> fancyMethod(ArrayList<String> blah) { return null; }
508741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    public static void checkGeneric() {
509741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        Field field;
510741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        try {
511741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            field = Main.class.getField("dummy");
512741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        } catch (NoSuchFieldException nsfe) {
513741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            throw new RuntimeException(nsfe);
514741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        }
515741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        Type listType = field.getGenericType();
516741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        System.out.println("generic field: " + listType);
517741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
518741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        Method method;
519741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        try {
520741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            method = Main.class.getMethod("fancyMethod",
521741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                new Class[] { ArrayList.class });
522741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        } catch (NoSuchMethodException nsme) {
523741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            throw new RuntimeException(nsme);
524741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        }
525741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        Type[] parmTypes = method.getGenericParameterTypes();
526741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        Type ret = method.getGenericReturnType();
527741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        System.out.println("generic method " + method.getName() + " params='"
528741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            + stringifyTypeArray(parmTypes) + "' ret='" + ret + "'");
529741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
530741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        Constructor ctor;
531741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        try {
532741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            ctor = Main.class.getConstructor(new Class[] { ArrayList.class });
533741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        } catch (NoSuchMethodException nsme) {
534741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            throw new RuntimeException(nsme);
535741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        }
536741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        parmTypes = ctor.getGenericParameterTypes();
537741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        System.out.println("generic ctor " + ctor.getName() + " params='"
538741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            + stringifyTypeArray(parmTypes) + "'");
539741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    }
540741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
541741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    /*
542741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes     * Convert an array of Type into a string.  Start with an array count.
543741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes     */
544741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes    private static String stringifyTypeArray(Type[] types) {
545741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        StringBuilder stb = new StringBuilder();
546741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        boolean first = true;
547741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
548741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        stb.append("[" + types.length + "]");
549741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
550741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        for (Type t: types) {
551741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            if (first) {
552741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                stb.append(" ");
553741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                first = false;
554741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            } else {
555741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes                stb.append(", ");
556741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            }
557741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes            stb.append(t.toString());
558741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        }
559741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
560741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        return stb.toString();
5615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
5625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
563ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    public static void checkUnique() {
564ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        Field field1, field2;
565ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        try {
566ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            field1 = Main.class.getField("dummy");
567ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            field2 = Main.class.getField("dummy");
568ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        } catch (NoSuchFieldException nsfe) {
569ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            throw new RuntimeException(nsfe);
570ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        }
571ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        if (field1 == field2) {
572ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("ERROR: fields shouldn't have reference equality");
573ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        } else {
574ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("fields are unique");
575ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        }
576ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        if (field1.hashCode() == field2.hashCode() && field1.equals(field2)) {
577ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("fields are .equals");
578ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        } else {
579ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("ERROR: fields fail equality");
580ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        }
581ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        Method method1, method2;
582ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        try {
583ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            method1 = Main.class.getMethod("fancyMethod", new Class[] { ArrayList.class });
584ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            method2 = Main.class.getMethod("fancyMethod", new Class[] { ArrayList.class });
585ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        } catch (NoSuchMethodException nsme) {
586ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            throw new RuntimeException(nsme);
587ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        }
588ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        if (method1 == method2) {
589ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("ERROR: methods shouldn't have reference equality");
590ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        } else {
591ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("methods are unique");
592ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        }
593ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        if (method1.hashCode() == method2.hashCode() && method1.equals(method2)) {
594ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("methods are .equals");
595ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        } else {
596ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom            System.out.println("ERROR: methods fail equality");
597ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        }
598ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom    }
599741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes
60068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    public static void checkParametrizedTypeEqualsAndHashCode() {
60168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Method method1;
60268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Method method2;
60368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Method method3;
60468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        try {
60568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            method1 = ParametrizedTypeTest.class.getDeclaredMethod("aMethod", Set.class);
60668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            method2 = ParametrizedTypeTest.class.getDeclaredMethod("aMethod", Set.class);
60768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            method3 = ParametrizedTypeTest.class.getDeclaredMethod("aMethodIdentical", Set.class);
60868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } catch (NoSuchMethodException nsme) {
60968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            throw new RuntimeException(nsme);
61068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
61168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
61268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        List<Type> types1 = Arrays.asList(method1.getGenericParameterTypes());
61368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        List<Type> types2 = Arrays.asList(method2.getGenericParameterTypes());
61468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        List<Type> types3 = Arrays.asList(method3.getGenericParameterTypes());
61568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
61668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Type type1 = types1.get(0);
61768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Type type2 = types2.get(0);
61868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Type type3 = types3.get(0);
61968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
62068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1 instanceof ParameterizedType) {
62168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1 is a ParameterizedType");
62268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
62368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type2 instanceof ParameterizedType) {
62468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type2 is a ParameterizedType");
62568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
62668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type3 instanceof ParameterizedType) {
62768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type3 is a ParameterizedType");
62868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
62968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
63068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.equals(type2)) {
63168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") equals type2("+type2+")");
63268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
63368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") does not equal type2("+type2+")");
63468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
63568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
63668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.equals(type3)) {
63768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") equals type3("+type3+")");
63868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
63968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") does not equal type3("+type3+")");
64068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
64168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.hashCode() == type2.hashCode()) {
64268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") hashCode equals type2("+type2+") hashCode");
64368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
64468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println(
64568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski                   "type1("+type1+") hashCode does not equal type2("+type2+") hashCode");
64668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
64768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
64868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.hashCode() == type3.hashCode()) {
64968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") hashCode equals type3("+type3+") hashCode");
65068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
65168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println(
65268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski                    "type1("+type1+") hashCode does not equal type3("+type3+") hashCode");
65368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
65468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    }
65568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
65668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    public static void checkGenericArrayTypeEqualsAndHashCode() {
65768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Method method1;
65868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Method method2;
65968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Method method3;
66068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        try {
66168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            method1 = GenericArrayTypeTest.class.getDeclaredMethod("aMethod", Object[].class);
66268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            method2 = GenericArrayTypeTest.class.getDeclaredMethod("aMethod", Object[].class);
66368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            method3 = GenericArrayTypeTest.class.getDeclaredMethod("aMethodIdentical", Object[].class);
66468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } catch (NoSuchMethodException nsme) {
66568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            throw new RuntimeException(nsme);
66668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
66768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
66868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        List<Type> types1 = Arrays.asList(method1.getGenericParameterTypes());
66968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        List<Type> types2 = Arrays.asList(method2.getGenericParameterTypes());
67068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        List<Type> types3 = Arrays.asList(method3.getGenericParameterTypes());
67168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
67268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Type type1 = types1.get(0);
67368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Type type2 = types2.get(0);
67468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        Type type3 = types3.get(0);
67568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
67668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1 instanceof GenericArrayType) {
67768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1 is a GenericArrayType");
67868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
67968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type2 instanceof GenericArrayType) {
68068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type2 is a GenericArrayType");
68168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
68268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type3 instanceof GenericArrayType) {
68368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type3 is a GenericArrayType");
68468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
68568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
68668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.equals(type2)) {
68768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") equals type2("+type2+")");
68868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
68968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") does not equal type2("+type2+")");
69068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
69168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
69268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.equals(type3)) {
69368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") equals type3("+type3+")");
69468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
69568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") does not equal type3("+type3+")");
69668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
69768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.hashCode() == type2.hashCode()) {
69868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") hashCode equals type2("+type2+") hashCode");
69968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
70068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println(
70168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski                   "type1("+type1+") hashCode does not equal type2("+type2+") hashCode");
70268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
70368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
70468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        if (type1.hashCode() == type3.hashCode()) {
70568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println("type1("+type1+") hashCode equals type3("+type3+") hashCode");
70668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        } else {
70768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski            System.out.println(
70868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski                    "type1("+type1+") hashCode does not equal type3("+type3+") hashCode");
70968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        }
71068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    }
71168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
7123ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier    private static void checkGetDeclaredConstructor() {
7133ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        try {
7143ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier            Method.class.getDeclaredConstructor().setAccessible(true);
7153778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            System.out.println("Didn't get an exception from Method.class.getDeclaredConstructor().setAccessible");
716daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier        } catch (SecurityException e) {
7173ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        } catch (NoSuchMethodException e) {
7183ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        } catch (Exception e) {
7193778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            System.out.println(e);
7203ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        }
7213ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        try {
7223ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier            Field.class.getDeclaredConstructor().setAccessible(true);
7233778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            System.out.println("Didn't get an exception from Field.class.getDeclaredConstructor().setAccessible");
724daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier        } catch (SecurityException e) {
7253ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        } catch (NoSuchMethodException e) {
7263ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        } catch (Exception e) {
7273778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            System.out.println(e);
7283ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        }
7293ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        try {
7303ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier            Class.class.getDeclaredConstructor().setAccessible(true);
7313778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            System.out.println("Didn't get an exception from Class.class.getDeclaredConstructor().setAccessible");
7323ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        } catch (SecurityException e) {
733daaf3265806eb2eadb2e03302bd68022fab5ca28Mathieu Chartier        } catch (NoSuchMethodException e) {
7343ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        } catch (Exception e) {
7353778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath            System.out.println(e);
7363ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        }
7373ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier    }
7383ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier
739ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    static void checkPrivateFieldAccess() {
740ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        (new OtherClass()).test();
741ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    }
742ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier
743923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes    public static void main(String[] args) throws Exception {
7445d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        Main test = new Main();
7455d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        test.run();
7465d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7473ed4c549ac05dce7f7984746f8d07348fd4074d9Mathieu Chartier        checkGetDeclaredConstructor();
748741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        checkAccess();
7493778c8769f05aafdc1bcc8064e8d1a9c1e008783Narayan Kamath        checkSwap();
750923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes        checkClinitForFields();
751923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes        checkClinitForMethods();
752741b5b7ef4c7fd4a786364bbf60d515489caff47Elliott Hughes        checkGeneric();
753ea46f950e7a51585db293cd7f047de190a482414Brian Carlstrom        checkUnique();
75468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        checkParametrizedTypeEqualsAndHashCode();
75568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski        checkGenericArrayTypeEqualsAndHashCode();
756ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        checkPrivateFieldAccess();
7575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
7585d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
7595d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7605d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7615d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass SuperTarget {
7625d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public SuperTarget() {
7635d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("SuperTarget constructor ()V");
7645d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        superInt = 1010101;
7655d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        superClassInt = 1010102;
7665d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
7675d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7685d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public int myMethod(float floatArg) {
7695d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("myMethod (F)I " + floatArg);
7705d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        return 6;
7715d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
7725d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7735d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public int superInt;
7745d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public static int superClassInt;
7755d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
7765d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7775d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhaoclass Target extends SuperTarget {
7785d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public Target() {
7795d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("Target constructor ()V");
7805d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
7815d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7825d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public Target(int ii, float ff) {
7835d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("Target constructor (IF)V : ii="
7845d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao            + ii + " ff=" + ff);
7855d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        anInt = ii;
7865d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
7875d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7885d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public int myMethod(int intarg) throws NullPointerException, IOException {
7895d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("myMethod (I)I");
7905d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println(" arg=" + intarg + " anInt=" + anInt);
7915d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        return 5;
7925d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
7935d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7945d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public int myMethod(String[] strarg, float f, char c) {
7955d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("myMethod: " + strarg[0] + " " + f + " " + c + " !");
7965d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        return 7;
7975d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
7985d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
7995d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public static void myNoargMethod() {
8005d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("myNoargMethod ()V");
8015d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
8025d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
8035d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void throwingMethod() {
8045d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("throwingMethod");
8055d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        throw new NullPointerException("gratuitous throw!");
8065d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
8075d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
8085d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public void misc() {
8095d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao        System.out.println("misc");
8105d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    }
8115d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
8125d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public int anInt;
8135d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public String string1 = "hey";
8145d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public String string2 = "yo";
8155d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public String string3 = "there";
8165d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private String string4 = "naughty";
8175d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public static final String constantString = "a constant string";
8185d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    private int aPrivateInt;
8195d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
8205d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public final int cantTouchThis = 77;
8215d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
8225d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public long pubLong = 0x1122334455667788L;
8235d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
8245d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao    public static double staticDouble = 3.3;
8255d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
8265d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
827923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughesclass FieldNoisyInit {
828ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    static {
829ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        System.out.println("FieldNoisyInit is initializing");
830ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        //Throwable th = new Throwable();
831ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        //th.printStackTrace();
832ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    }
8335d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
8345d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao
835923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughesclass FieldNoisyInitUser {
836ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    static {
837ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        System.out.println("FieldNoisyInitUser is initializing");
838ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    }
839ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    public static int staticField;
840ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    public static FieldNoisyInit noisy;
841923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes}
842923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
843923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughesclass MethodNoisyInit {
844ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    static {
845ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        System.out.println("MethodNoisyInit is initializing");
846ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        //Throwable th = new Throwable();
847ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        //th.printStackTrace();
848ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    }
849923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes}
850923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughes
851923e8b8e936ead33408e111682aa9372e3a7ed43Elliott Hughesclass MethodNoisyInitUser {
852ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    static {
853ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        System.out.println("MethodNoisyInitUser is initializing");
854ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    }
855ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    public static void staticMethod() {}
856ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    public void createMethodNoisyInit(MethodNoisyInit ni) {}
8575d1ac920fdaef5d4ec8f66bb734488cd9660b024jeffhao}
85863f5b9e8f660ae761901072821ece30d87891644Jeff Hao
85963f5b9e8f660ae761901072821ece30d87891644Jeff Haoclass Thrower {
860ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    public Thrower() throws UnsupportedOperationException {
861ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        throw new UnsupportedOperationException();
862ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    }
86363f5b9e8f660ae761901072821ece30d87891644Jeff Hao}
86468b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
86568b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebskiclass ParametrizedTypeTest {
86668b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    public void aMethod(Set<String> names) {}
86768b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    public void aMethodIdentical(Set<String> names) {}
86868b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski}
86968b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski
87068b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebskiclass GenericArrayTypeTest<T> {
87168b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    public void aMethod(T[] names) {}
87268b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski    public void aMethodIdentical(T[] names) {}
87368b539ed7be2762bcab43f1c05174ef4a1d15625Piotr Jastrzebski}
874ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier
875ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartierclass OtherClass {
876ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    private static final long LONG = 1234;
877ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    public void test() {
878ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        try {
879ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier            Field field = getClass().getDeclaredField("LONG");
880ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier            if (1234 != field.getLong(null)) {
881ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier              System.out.println("ERROR: values don't match");
882ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier            }
883ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        } catch (Exception e) {
884ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier            System.out.println(e);
885ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier        }
886ca239af73e512df5eeb80fe6c09c2ca614649e06Mathieu Chartier    }
8873beb245da9392818e3154d47593f82cf0ef69aacMathieu Chartier}
888