反射

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
原文地址:https://www.cnblogs.com/cyhj/p/4621324.html