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 @Override264 public String toString() {265 return "Person{" +266 "name='" + name + '\'' +267 ", age=" + age +268 '}';269 }270 }271 @hahah272 class Student extends Person{273 public void pr(){274 System.out.println("hhaha");275 }276 }277 278 class Test {279 280 }
原文转载:http://www.shaoqun.com/a/622661.html
gtc:https://www.ikjzd.com/w/974
noon:https://www.ikjzd.com/w/259
1importjava.lang.annotation.*;2importjava.lang.reflect.Array;3importjava.lang.reflect.Constructor;4importjava.lang.reflect.InvocationTargetException;5importjava.lang.reflect.Method;6importjava.util.*;
FEN:https://www.ikjzd.com/w/2668
执御:https://www.ikjzd.com/w/717.html
kkr:https://www.ikjzd.com/w/1340
亚马逊人"苦逼"日记 运营的日常一天:https://www.ikjzd.com/home/139589
工人又准备罢工!加拿大站点将面临更高的邮资费用:https://www.ikjzd.com/home/14357
口述:老公说不同意离婚他就去死:http://lady.shaoqun.com/m/a/114396.html
No comments:
Post a Comment