• 反射笔记


    反射

    reflection library

    reflective:能分析类的能力的程序

    参考:https://www.zhihu.com/question/377483107/answer/1079967402

    https://www.w3cschool.cn/java/java-reflex.html

    学习方法:学习一项新的技术之前,请先搞清楚为什么要学这个新的东西?

    重点掌握

    获取Class的几种方式
    
    通过Class创建对象,获取构造器、成员变量、方法
    
    通过反射API修改成员变量的值,调用方法	      
    

    Class类的主要API

    成员变量--Field
    
    方法--Method
    
    构造器--Constructor
    
    一)获得Class类的方式(手工地加载某个类)

    1.Object类的getClass()方法

    Random r = new Random();
    Class<?> rClass = r.getClass();
    System.out.println(rClass);//class java.util.Random
    System.out.println(rClass.getName());//java.util.Random
    

    2.Class类中的静态方法 public static Class ForName(String className)

    Class clazz = Class.forName("com.pengluo.User");//参数:完整路径的包名和类名
    

    父类对象clazz.getSuperclass()

    实现的接口clazz.getInterfaces()

    3.任意类型.class

    Class c1 = int.class;
    Class c2 = Double[].class;
    Class c3 = ArrayList.class;
    
    二)实例一个Class类的对象
    //方法一:默认构造方法
    User u1 = (User) clazz.newInstance();
    //set方法赋值
    u1.setName("pengluo");
    u1.setSex("male");
    
    
    //方法二:获取全部的构造函数,选择一个构造函数创建对象
    Constructor<?> cons[] = clazz.getConstructors();
    
    user = (user) cons[0].newInstance("Rollen");
    
    
    三)获取Class类的成员变量(属性)

    1: 获取Class对象

    2:通过Class对象获取Constructor对象

    3:Object obj = Constructor.newInstance()创建对象

    4:Field field = Class.getField("指定变量名")获取单个成员变量对象

    5:field.get(obj) 获取obj对象的field字段的值

    6:field.set(obj,"") 为obj对象的field字段赋值

    Field[] Fieds = clazz.getFields();//获得类以及从超类(父类)中继承到的公共域
    Field[] Fieds = clazz.getDeclaredFields();//获得类中声明的全部域,包括私有的
    //遍历输出
    for (int i = 0; i <Fieds.length ; i++) {
                String name = Fieds[i].getName();
                String Type = Fieds[i].getType().getName();
                System.out.println(name+":"+Type);
    }
    
    Field name = clazz.getDeclaredField("name");//获取Class类的特定的成员变量(属性)
    
    四)获取Class类的方法
    Method method[] = clazz.getMethods();//获得类以及从超类(父类)中继承到的公有方法
    Method method[] = clazz.getDeclaredMethods();//获得类中声明的全部方法,包括私有的
    Method method = clazz.getMethod();//获取Class类的某个指定的方法
    //如果调用的是私有方法那么需要暴力访问        
    method.setAccessiable(true);
    
    ArrayList<Integer> list = new ArrayList<Integer>();
    Method method10 = list.getClass().getMethod("add",Object.class);
    method10.invoke(list,"Java反射机制实例。");
    
  • 相关阅读:
    Codeforces 1065C Make It Equal
    Codeforces 1065B Vasya and Isolated Vertices
    Codeforces 1065A Vasya and Chocolate
    Luogu P2467 [SDOI2010]地精部落
    Codeforces 1042C Array Product
    Codeforces 1041C Coffee Break
    JMeter安装和环境变量搭建
    Jenkins
    Jenkins介绍
    Docker
  • 原文地址:https://www.cnblogs.com/PengLuo22/p/13726419.html
Copyright © 2020-2023  润新知