package com.e2u.reflect; import java.lang.reflect.*; public class GenericTest { public static void test() { ReflectData rd = new ReflectData(); try { Class clazz = rd.getClass(); Constructor constructor = clazz.getConstructor(null); ReflectData tmp = (ReflectData)constructor.newInstance(null); Class[] parameterTypes = {int.class}; Method method = clazz.getDeclaredMethod("method1", parameterTypes); Object obj = clazz.getDeclaredMethods(); Object[] parameters = {new Integer(5)}; method.setAccessible(true); Object ret = method.invoke(tmp, parameters); System.out.println(tmp.a); Field field = clazz.getDeclaredField("c"); field.setAccessible(true); field.setInt(tmp, 10); System.out.println(tmp.getC()); Class[] classes = clazz.getDeclaredClasses(); Class[] innerClassConParamTypes = {clazz}; for(int i = 0; i < classes.length; i++) { System.out.println(classes[i]); if(Modifier.isStatic(classes[i].getModifiers())) { constructor = classes[i].getConstructor(); obj = constructor.newInstance(); } else { constructor = classes[i].getConstructor(innerClassConParamTypes); obj = constructor.newInstance(tmp); } Class tempClass = classes[i].getEnclosingClass(); Object[] signers = classes[i].getSigners(); method = classes[i].getDeclaredMethod("getData", parameterTypes); method.setAccessible(true); Object result = method.invoke(obj, parameters); System.out.println(result); method = classes[i].getDeclaredMethod("setData", parameterTypes); method.setAccessible(true); result = method.invoke(obj, parameters); System.out.println(result); if(Modifier.isStatic(classes[i].getModifiers())) { Field filed = classes[i].getDeclaredField("localClass"); result = filed.get(obj); System.out.println(result); tempClass = (Class)result; if(tempClass.isLocalClass()) { System.out.println("IsLocalClass"); } System.out.println(tempClass.getEnclosingMethod()); System.out.println(tempClass.getEnclosingConstructor()); System.out.println(tempClass.getEnclosingClass()); filed = classes[i].getDeclaredField("anonymousInnerClass"); result = filed.get(obj); System.out.println(result); tempClass = (Class)result; if(tempClass.isAnonymousClass()) { System.out.println("isAnonymousClass"); } System.out.println(tempClass.getEnclosingMethod()); System.out.println(tempClass.getEnclosingConstructor()); System.out.println(tempClass.getEnclosingClass()); } } } catch(Exception e) { e.printStackTrace(); } } /** * @param args */ public static void main(String[] args) { test(); } } class ReflectData { public int a; protected int b; private int c; public ReflectData() { a = 0; b = 0; c = 0; } private void method1(int x) { a = x; } public int getC() { return c; } private static int staticMethod1(int x) { return x * x; } private static class StaticInnerClass { private int data; public Class localClass = null; public Class anonymousInnerClass = null; public StaticInnerClass() { data = 0; } private int getData(int inc) { data += inc; return data; } private static int staticMethod(int y) { return y + 100; } public void setData(int x) { final StringBuffer strBuf = new StringBuffer(); Runnable runnable = new Runnable() { public void run() { strBuf.append(System.currentTimeMillis()); } }; if(anonymousInnerClass == null) { anonymousInnerClass = runnable.getClass(); } runnable.run(); class LocalClass implements Runnable { public void run() { strBuf.append(System.currentTimeMillis()); } } if(localClass == null) { localClass = LocalClass.class; } data = (int)(Long.parseLong((strBuf.toString()) + x)); } } private class InnerClass { private int data; public InnerClass() { data = 0; } private int getData(int inc) { data -= inc; return data; } public void setData(int x) { } private int staticMethod(int y) { return y + 100; } } }