reflect
1、获取class对象的三种方法:再java文件加载的时候,首先通过.java文件通过编译生成.class文件。类加载器会把.class文件加载到内存中。那么在内存中会存在一个(产生Class对象,一个类 只会产生一个Class对象)。我们通过反射就是操作的该对象。
//1、通过class.forname()来获取Class对象 Class clazz = Class.forName("com.mashibing.entity.Emp"); //2、通过类名.class来获取 Class<Emp> clazz = Emp.class; //3、通过对象的getClass()来获取 Class clazz = new Emp().getClass(); //4、如果是一个基本数据类型,那么可以通过Type的方式来获取Class对象 Class type = Integer.TYPE;
2、反射可以获取变量,构造方法,方法。不论时私有的还有共有的都可以获取。
Class<?> clazz = Class.forName("com.mashibing.reflect.Student"); //获取成员变量,包括子类及父类,同时只能包含公共的方法 Field[] fields = clazz.getFields(); for (Field field : fields) { System.out.println(field); System.out.println(field.getName()); System.out.println(field.getType()); System.out.println(field.getModifiers()); System.out.println("-----"); } System.out.println("======================="); //此方法返回的是当前类的所有属性,不仅仅局限于公共访问修饰符,所有的访问修饰符都可以拿到 Field[] declaredFields = clazz.getDeclaredFields(); for (Field declaredField : declaredFields) { System.out.println(declaredField.getName()); } System.out.println("========================"); //反射在一定程度上破坏了封装性,需要合理使用 Field address = clazz.getDeclaredField("address"); //设置该属性是否能被访问,true表示能被访问,破坏了封装性 address.setAccessible(true); System.out.println(address.getName()); Object o = clazz.newInstance(); address.set(o,"北京市"); System.out.println(((Student)o).getAddress()); System.out.println("==============================="); //获取该对象的普通方法,包含的方法范围是当前对象及父类对象的所有公共方法 Method[] methods = clazz.getMethods(); for (Method method : methods) { System.out.println(method.getName()); } System.out.println("-----------------------"); //获取当前类中所有的方法,无论什么访问修饰符 Method[] declaredMethods = clazz.getDeclaredMethods(); for (Method declaredMethod : declaredMethods) { System.out.println(declaredMethod.getName()); } System.out.println("--------------"); Method add = clazz.getDeclaredMethod("add", int.class, int.class); add.setAccessible(true); Object o1 = clazz.newInstance(); add.invoke(o1,123,123); System.out.println("----------------------"); //获取对象的所有构造方法,只能获取公有的改造方法 Constructor<?>[] constructors = clazz.getConstructors(); for (Constructor<?> constructor : constructors) { System.out.println(constructor.getName()); } System.out.println("--------------"); //获取所有的构造方法,无论是私有还是公有 Constructor<?>[] declaredConstructors = clazz.getDeclaredConstructors(); for (Constructor<?> declaredConstructor : declaredConstructors) { System.out.println(declaredConstructor.getName()); } //如何调用私有的构造方法呢? Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class, String.class); declaredConstructor.setAccessible(true); Student o2 = (Student)declaredConstructor.newInstance("msb", 23, "java"); System.out.println(o2);
本文来自博客园,作者:Jerry&Ming,转载请注明原文链接:https://www.cnblogs.com/jerry-ming/articles/16213588.html