本质:先加载类 再解刨类的方法,字段,构造函数
目的:解刨出构造函数 为了new对象
解刨出字段 为了封装数据进去
解刨方法 为了用方法
反射类的构造函数(解刨)---------------------为了架构
- 1)Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- 2)Class clas=new Person().getClass(); //加载到内存
- 3) Class clas=Person.class //加载到内存
- Constructor c = clas.getConstructor(null/String.class); //参数控制解刨出的是哪个构造函数
- Person p= (Person)c .getConstructor(null/"fdfdf") //调用构造函数,创建Person类实例(对象)
- Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- Constructor c =clas.getDeclaredConstructor(List.class) //加载私有构造函数
- c.setAccessible(true); 强暴解刨, 读取所有权限
- Person p= (Person)c .getConstructor(new ArrayList()); //调用构造函数
//创建对象的另一种途径
- 1)Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- Person p= (Person) clas.newInstance();//调用无参数构造函数,创建Person类实例(对象)
反射类的方法
- Person p=new Person();
- Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- Method method = clas.getMethod("xx",null);//加载反射方法 xx是方法名字 导包:java.lang.reflect.Method;
- method.invoke(p,null);// 传执行这个方法的对象
反射类的私有方法
- Person p=new Person();
- Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- Method method = clas.getDeclaredMethod("xx",null);//加载私有方法 xx是方法名字 导包:java.lang.reflect.Method;
- method.setAccessible(true);//强暴解刨
- method.invoke(p,null);// 传执行这个方法的对象
注意:有时要强转类型
反射main方法
- Method method = clas.getMethod(",main",String[].class);反射main方法
- 1)method.invoke(null,(Object)new String[]{"aa","bb"});//要强转Object,因为在数组反射处理上sun有些小问题。
- 2)method.invoke(null,new object []{new String[]{"aa","bb"}});//因为在数组反射处理上sun有些小问题,让他拆分得到数组
jdk的问题,所以main方法要注意强转
反射字段
- //public String name = "aaa" //假设person里有以下三个字段
- // private int password = 123;
- // private static int age = 123;
- Person p = new Person;
- Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- Field f = clas.getField("name"); //获取到name
- object value= (String)f.get(p); //通过对象P获取到name的值 (已知类型可以用String value=(String)f.get(p);)
- Class type = f.getType(); // 通过反射字段还可知道类型 type = String
- if(type.equals(String.class)){String svalue=(String) value;system.out.print(svalue)}//获取到类型后,进行精准转化类型
- f.set(p,"xxxx");//设置字段的值
-
- Person p = new Person;
- Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- Field f = clas.getDeclareField("password"); //获取到私有的password
- f.setAccessible(true);//强暴解刨
- System.out.println(f.get.(p));
-
- Person p = new Person;
- Class clas = Class.forName("cn.xx.xx.xx"); //加载到内存
- Field f = clas.getDeclareField("age"); //获取到私有的静态成员age
- f.setAccessible(true);//强暴解刨
- System.out.println(f.get.(p));
私有字段同上。转自:http://blog.csdn.net/zhangpengyu321/article/details/8977651