java的反射 ﹏ヽ暗。殇╰゛Y 2022-06-16 01:17 127阅读 0赞 **一.Class类** **1.万物皆对象,对象时类的实例,类是java.lang.Class的实例(对象)** **2.如何获取Class类的类对象,三种方法** Class的构造方法时私有的,所有不能通过的new的方式创建 1.使用类都有的静态成员变量class,格式:类名.class; Class u1 = User.class; 2.使用类的实例对象的getClass()方法,格式:对象.getClass(); Class u2 = user.getClass(); 3.通过Class类的静态方法,会抛异常 Class u3 = Class.forName(“com.tiglle.User”); **3.Class类的实例的特点** 1.官方定义,一个Class类的实例为此类的 类类型:class type Class u = User.class; c为User的类类型 2.同一个类的不同Class类的实例相等 Class u1 = User.class; Class u2 = user.getClass(); Class u3 = Class.forName(“com.tiglle.User”); u1==u2==u3 结果是true **4.通过类的类类型创建类的实例对象,需要此类有无参数的构造方法** Class c = User.Class(); User user = (User) c.newInstance(); 会抛异常,返回为Object **二.静态加载类和动态加载类** **1.静态加载类:编译时刻加载类** User u = new User(); new创建对象 是静态加载类,在编译时就加载了所有可能要用到的类 **2.动态加载类:运行时刻加载类** Class.forName(“com.tiglle.User”); Class.forName() 在运行时才会加载要用到的类 **三.Class实例获取类的信息** **1.基本数据类型的 Class实例(类类型)** Class c1 = int.class; Class c2 = String.class; Class c3 = double.class Class c4 = void.class; **2.获取类的信息** Class c = User.class; 1.获取类的名称 c.getName():带包名的名称 c.getSimpleName():不带包名的名称 2.获取类的方法 Method也是Class类的实例:java.lang.Method Method\[\] m = c.getMethods():获取所有public权限的方法,包括父类继承的 Method\[\] m = c.getDeclaredMethods():获取所有权限的本类的方法 Method m = c.getDeclaredMethods(“方法名”,”参数列表1”,”参数列表2”); Method m = c.getDeclaredMethods(“say”,”int.class”,”String.class”); Class returnType = m\[0\].getReturnType():获取方法的返回值类型 的类类型 returnType.getName():获取返回值的名称 m\[0\].getName():获取方法名 Class\[\] paramClass = m\[0\].getParameterTypes():获取参数列表类类型的数组(int.class ,String.class,…) paramClass\[0\].getName():参数列表第一个参数的类名 **3.获取类的成员变量的信息** 成员变量也是Class类的实例:java.lang.reflect.Field Field封装了关于成员变量的所有操作 Class c = User.Class 1.Field\[\] fs = c.getFields():获取所有的public的成员变量的信息,包括从父类继承的 2.Field\[\] fs = c.getDeclaredFields():不限制访问权限获取所有自己声明的成员变量的信息 1.Class fieldType = fs\[0\].getType():得到成员变量的类型的Class实例(类的类类型) 2.String fieldName = field.getName():得到成员变量的名称 2.String typeName = fieldType.getName():获取成员变量的类型的类名称 **4.获取构造方法的信息** 构造函数也是对象:java.lang.Constructor Class c = User.class; 1.Constructor\[\] cons = c.getConstructors():获取所有构造方法的数组 2.Constructor\[\] cons = c.getDeclaredConstructors():获取所有自己生命的构造函数(和上面的区别暂时没懂) String name = cons\[0\].getName():获取构造函数的函数名 Class\[\] paramClass = cons\[0\].getParameterTypes():获取构造方法的参数列表的类的类类型的数组 paramClass\[0\].getName():获取参数1的类名 **四.方法的反射** **1.方法反射的使用** Class c = User.class; Method m = c.getDeclaredMethods(“方法名”,”参数列表1的类类型”,”参数列表2的类类型”); Method m = c.getDeclaredMethods(“say”,”int.class”,”String.class”); 调用=new User().方法名(“参数列表1”,”参数列表2”); Object o(返回值,如果没返回值为null) = m.invoke(“调用谁方法(对象)”,”参数列表1”,”参数列表2”); **2.使用方法的反射绕过编译期间泛型的检测** //只能加String的list List list = new ArrayList(); list.add(“xiaoming”); Class listClass = list.getClass(); Method m = listClass.getMethod(“add”,Object.class); //使用泛型绕过反射的检测,添加int类型 Object o = m.invoke(list,2); System.out.println(list); 结果: \[xiaoming, 3\] 此时不能使用forEach循环集合
还没有评论,来说两句吧...