1 import java.lang.annotation.*; 2 import java.lang.reflect.Array; 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.InvocationTargetException; 5 import java.lang.reflect.Method; 6 import java.util.*; 7 8 public class TestAnnotation { 9 static int count = 0; 10 11 public static void main(String[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException { 12 String annoName = "hahah"; 13 String[] a = new String[10]; 14 System.out.println(a.toString()); 15 testClass("Student", annoName); 16 } 17 18 public static void testClass(String className, String annoName) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException { 19 System.out.println(); 20 System.out.println("开始定位:" + className); 21 Class c = Class.forName(className); 22 Class cCopy =c; 23 if (c.getAnnotation(Class.forName(annoName)) != null) { 24 System.out.println("该类带有注解" + annoName + ",开始实例化测试。"); 25 Constructor[] declaredConstructors = c.getDeclaredConstructors(); 26 27 for (Constructor constructor :declaredConstructors) { 28 System.out.print("构造器为:"); 29 System.out.println(constructor); 30 Method[][] methods = getMethods(c); 31 Object o = getInstance(constructor); 32 runMethods(o,methods); 33 } 34 } else { 35 System.out.println("该类未被" + annoName + "注解,不进行实例测试。"); 36 } 37 } 38 public static Method[][] getMethods(Class c) throws InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException { 39 Method[] methods = c.getDeclaredMethods(); 40 ArrayList<Method> methodsVoid = new ArrayList<Method>(); 41 ArrayList<Method> methodsOthers = new ArrayList<Method>(); 42 //将方法分为有返回方法和无返回方法,有返回方法前后各执行一次,无返回方法中间执行一遍。 43 for (Method method : methods) { 44 if (method.getReturnType().toString().equals("void")) { 45 methodsVoid.add(method); 46 } else { 47 methodsOthers.add(method); 48 } 49 } 50 while(true){ 51 c = c.getSuperclass(); 52 if(c.getName().equals("java.lang.Object")){ 53 break; 54 }else{ 55 methods = c.getDeclaredMethods(); 56 //将方法分为有返回方法和无返回方法,有返回方法前后各执行一次,无返回方法中间执行一遍。 57 for (Method method : methods) { 58 if (method.getReturnType().toString().equals("void")) { 59 methodsVoid.add(method); 60 } else { 61 methodsOthers.add(method); 62 } 63 } 64 } 65 } 66 67 return new Method[][]{methodsVoid.toArray(new Method[methodsVoid.size()]),methodsOthers.toArray(new Method[methodsOthers.size()])}; 68 } 69 70 public static void runMethods(Object o, Method[][] methods) throws InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException { 71 for (Method method : methods[1]) { 72 System.out.println(method); 73 System.out.print("方法:" + method.getName() + " "); 74 System.out.print("参数为:"); 75 ArrayList argsList = getArgus(method); 76 System.out.println(argsList); 77 System.out.println(argsList.toString()); 78 System.out.print("返回结果:"); 79 System.out.println(method.invoke(o, argsList.toArray())); 80 } 81 for (Method method : methods[0]) { 82 System.out.print("方法:" + method.getName() + " "); 83 System.out.print("参数为:"); 84 ArrayList argsList = getArgus(method); 85 System.out.println(argsList.toString()); 86 System.out.print("返回结果:"); 87 System.out.println(method.invoke(o, argsList.toArray())); 88 } 89 for (Method method : methods[1]) { 90 System.out.print("方法:" + method.getName() + " "); 91 System.out.print("参数为:"); 92 ArrayList argsList = getArgus(method); 93 System.out.println(argsList.toString()); 94 System.out.print("返回结果:"); 95 System.out.println(method.invoke(o, argsList.toArray())); 96 } 97 } 98 99 public static ArrayList getArgus(Method method) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException { 100 Class[] parameters = method.getParameterTypes(); 101 ArrayList argsList = new ArrayList(); 102 if (parameters.length > 0) { 103 for (Class parameter : parameters) { 104 argsList.add(getArgu(parameter)); 105 } 106 } 107 return argsList; 108 } 109 //重载一下 110 public static Object[] getArgus(Constructor constructor) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException { 111 Class[] parameters = constructor.getParameterTypes(); 112 List argsList = new ArrayList(); 113 if (parameters.length > 0) { 114 for (Class parameter : parameters) { 115 argsList.add(getArgu(parameter)); 116 } 117 } 118 return argsList.toArray(); 119 } 120 121 122 public static Object getArgu(Class parameter) throws ClassNotFoundException, InvocationTargetException, InstantiationException, IllegalAccessException { 123 if (parameter.isArray()) { 124 int num = 10; 125 Class pp = parameter.getComponentType(); 126 Object list = Array.newInstance(pp,num); 127 for (int i = 0; i < num; i++) { 128 Array.set(list,i,getArgu(pp));//数组对象递归初始化参数 129 } 130 return list; 131 } else { 132 String[] p = parameter.getName().split("\\."); 133 String pp = p[p.length - 1]; 134 if (pp.equals("String")) { 135 int num = new Random().nextInt(10) + 1; 136 return getRandomString(num); 137 } else if (pp.equals("int")) { 138 return getRandomInt(100); 139 } else if (pp.equals("byte")) { 140 return getRandomByte(); 141 } else if (pp.equals("short")) { 142 return getRandomShort(); 143 } else if (pp.equals("long")) { 144 return getRandomLong(); 145 } else if (pp.equals("float")) { 146 return getRandomFloat(); 147 } else if (pp.equals("double")) { 148 return getRandomDouble(); 149 } else if (pp.equals("char")) { 150 return getRandomChar(); 151 } else { 152 return getInstance(pp); 153 154 } 155 } 156 } 157 public static Object getInstance(String className) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException { 158 Class c = Class.forName(className); 159 Constructor[] constructors = c.getDeclaredConstructors(); 160 Constructor constructor = constructors[count++ % constructors.length]; 161 return getInstance(constructor); 162 } 163 164 public static Object getInstance(Constructor constructor) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException { 165 // Constructor constructor = constructors[new Random().nextInt(constructors.length)]; 166 // System.out.println(constructor); 167 return constructor.newInstance(getArgus(constructor)); 168 } 169 170 public static String getRandomString(int length) { 171 String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 172 Random random = new Random(); 173 StringBuffer sb = new StringBuffer(); 174 for (int i = 0; i < length; i++) { 175 int number = random.nextInt(62); 176 sb.append(str.charAt(number)); 177 } 178 return sb.toString(); 179 } 180 181 public static int getRandomInt(int max) { 182 int a = new Random().nextInt(max); 183 if (getRandomBoolean()){ 184 a = - a; 185 } 186 return a; 187 } 188 public static int getRandomInt() { 189 int a = getRandomInt(Integer.MAX_VALUE); 190 return a; 191 } 192 public static byte getRandomByte() { 193 return (byte)getRandomInt(Byte.MAX_VALUE); 194 } 195 public static short getRandomShort() { 196 return (short)getRandomInt(Short.MAX_VALUE); 197 } 198 public static long getRandomLong() { 199 long a = new Random().nextLong(); 200 if (getRandomBoolean()){ 201 a = - a; 202 } 203 return a; 204 } 205 public static float getRandomFloat() { 206 float a = new Random().nextFloat(); 207 if (getRandomBoolean()){ 208 a = - a; 209 } 210 return a; 211 } 212 public static double getRandomDouble() { 213 double a = new Random().nextDouble(); 214 if (getRandomBoolean()){ 215 a = - a; 216 } 217 return a; 218 } 219 public static boolean getRandomBoolean(){ 220 return new Random().nextBoolean(); 221 } 222 public static char getRandomChar(){ 223 return (char) getRandomInt(Character.MAX_VALUE); 224 } 225 226 }
227 //文件类的get就不弄了,可以动态生成各个类型文件,或者弄些文件夹,每个文件夹一种类型,把文件都放进去,然后随机获取。 228 @Target(ElementType.TYPE) 229 @Retention(RetentionPolicy.RUNTIME) 230 @interface hahah { 231 } 232 233 234 class Person { 235 String name; 236 int age; 237 238 public Person() { 239 240 } 241 242 public Person(String name, int age) { 243 this.name = name; 244 this.age = age; 245 } 246 247 public String getName() { 248 return name; 249 } 250 251 public void setName(String name, Test t, int[] ha,String[] s,Student[] st) { 252 this.name = name; 253 } 254 255 public int getAge() { 256 return age; 257 } 258 259 public void setAge(int age) { 260 this.age = age; 261 } 262 263 @Override 264 public String toString() { 265 return "Person{" + 266 "name='" + name + '\'' + 267 ", age=" + age + 268 '}'; 269 } 270 } 271 @hahah 272 class Student extends Person{ 273 public void pr(){ 274 System.out.println("hhaha"); 275 } 276 } 277 278 class Test { 279 280 }