1获取Class对象,及其方法
1 Class<?> clazz = String.class; 2 clazz = Class.forName("java.lang.String"); 3 clazz = new String().getClass(); 4 5 System.out.println(Integer.class==int.class);//false 6 System.out.println(Integer.TYPE==int.class);//true 7 int.class.isPrimitive();//判断字节码对象是否是原始类型 8 int[].class.isArray();////判断字节码对象是否是数组类型
2通过Class对象操作其构造方法
1 Constructor<?> constructor = clazz.getConstructor(StringBuilder.class); 2 String str = (String) constructor.newInstance(new StringBuilder("xdfgggfg"));
3通过Class对象操作其成员变量
1 clazz = ReflectPoint.class; 2 Field fieldX = clazz.getField("x");//获取成员字段对象 3 Field fieldY = clazz.getDeclaredField("y");//获取私有成员字段对象必须用此方法 4 5 ReflectPoint obj = new ReflectPoint(3,6); 6 7 int x = (Integer) fieldX.get(obj);//获取成员字段的值 8 9 fieldY.setAccessible(true);//获取私有成员字段的值,先获取访问权限 10 int y = (Integer) fieldY.get(obj); 11 12 System.out.println(fieldY.getType()==int.class);//获取字段的类型
4数组的反射相关知识点
int[] a1 = new int[3]; int[] a2 = new int[4]; String[] a3 = new String[3]; System.out.println(a1.getClass().getSuperclass().getName());//java.lang.Object System.out.println(a1.getClass()==a2.getClass());//true,纬度和类型相同,则其class对象相同 Object[] objs1 = a1; //int类型不是Object,不可转为Object数组 Object[] objs2 = a3; Arrays.asList(a1);//不会将a1拆开,因a1不可转为Object数组 Arrays.asList(a3);//会将a1拆开 Array.getLength(new int[5]);//获取数组的长度 Array.get(new int[5], 2);//获取数组某个索引位置的值
5通过class对象操作方法
1 clazz = String.class; 2 Method charAtMethod = clazz.getMethod("charAt", int.class);//获取成员方法对象 3 4 charAtMethod.invoke("asdfgjfjo", 2);//静态方法第一参数传null