Java web--反射(解刨)

本质:先加载类           再解刨类的方法,字段,构造函数            

目的:解刨出构造函数       为了new对象

   解刨出字段             为了封装数据进去

   解刨方法                为了用方法  

反射类的构造函数(解刨)---------------------为了架构

 已存在Person类
  1. 1)Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存                                                                                                                                                                                                                                                                       
  2. 2)Class clas=new Person().getClass();  //加载到内存  
  3. 3)  Class clas=Person.class        //加载到内存  
  4. Constructor c = clas.getConstructor(null/String.class); //参数控制解刨出的是哪个构造函数
  5. Person p= (Person)c .getConstructor(null/"fdfdf") //调用构造函数,创建Person类实例(对象)
 
  1. Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存
  2. Constructor c =clas.getDeclaredConstructor(List.class) //加载私有构造函数  
  3. c.setAccessible(true);  强暴解刨, 读取所有权限 
  4. Person p= (Person)c .getConstructor(new ArrayList()); //调用构造函数 



//创建对象的另一种途径

  1. 1)Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存                                                                                                                                                                                                                                                                       
  2. Person p= (Person) clas.newInstance();//调用无参数构造函数,创建Person类实例(对象)

反射类的方法 


  1. Person p=new Person();
  2. Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存
  3. Method method = clas.getMethod("xx",null);//加载反射方法   xx是方法名字   导包:java.lang.reflect.Method; 
  4. method.invoke(p,null);// 传执行这个方法的对象  

反射类的私有方法 

 
  1. Person p=new Person();
  2. Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存
  3. Method method = clas.getDeclaredMethod("xx",null);//加载私有方法     xx是方法名字   导包:java.lang.reflect.Method;     
  4. method.setAccessible(true);//强暴解刨 
  5. method.invoke(p,null);// 传执行这个方法的对象 


注意:有时要强转类型

反射main方法

  1. Method method = clas.getMethod(",main",String[].class);反射main方法  
  2. 1)method.invoke(null,(Object)new String[]{"aa","bb"});//要强转Object,因为在数组反射处理上sun有些小问题。  
  3. 2)method.invoke(null,new object []{new String[]{"aa","bb"}});//因为在数组反射处理上sun有些小问题,让他拆分得到数组

jdk的问题,所以main方法要注意强转

反射字段

  1. //public String name  = "aaa"  //假设person里有以下三个字段
  2. // private int password = 123;
  3. // private static int age = 123;
    1. Person p = new Person;
    2. Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存
    3. Field f = clas.getField("name"); //获取到name
    4. object value= (String)f.get(p);  //通过对象P获取到name的值 (已知类型可以用String value=(String)f.get(p);)
    5. Class type = f.getType(); // 通过反射字段还可知道类型   type = String  
    6. if(type.equals(String.class)){String svalue=(String) value;system.out.print(svalue)}//获取到类型后,进行精准转化类型
    7. f.set(p,"xxxx");//设置字段的值
  4.   
    1. Person p = new Person;
    2. Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存
    3. Field f = clas.getDeclareField("password"); //获取到私有的password
    4. f.setAccessible(true);//强暴解刨 
    5. System.out.println(f.get.(p));
  5.    
    1. Person p = new Person;
    2. Class clas = Class.forName("cn.xx.xx.xx");  //加载到内存
    3. Field f = clas.getDeclareField("age"); //获取到私有的静态成员age
    4. f.setAccessible(true);//强暴解刨 
    5. System.out.println(f.get.(p));

私有字段同上。转自:http://blog.csdn.net/zhangpengyu321/article/details/8977651

既往不恋,未来不迎,当下不杂
原文地址:https://www.cnblogs.com/SnowingYXY/p/6029550.html