• 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

    既往不恋,未来不迎,当下不杂
  • 相关阅读:
    C++顺序容器知识总结
    C++标准库vector类型的使用和操作总结
    C++迭代器的使用和操作总结
    快速入门正则表达式
    深入浅出 Create React App
    JavaScript 中有关数组对象的方法
    JavaScript 中有关时间对象的方法
    Web前端小白入门指迷
    Mac OSX 下用 Homebrew 安装 MongoDB 并配置到 WebStorm 中
    面向对象三大特性五大原则 + 低耦合高内聚
  • 原文地址:https://www.cnblogs.com/SnowingYXY/p/6029550.html
Copyright © 2020-2023  润新知