• java反射


    what

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。


    class类

    万物皆对象,类是Class类的对象

    获取class类

     //方式1 通过Object类的getClass方法
    Person p = new Person();
    Class c1 = p.getClass();
    
    Person p2 = new Person();
    Class c2 = p2.getClass();
    
    System.out.println(p == p2);
    System.out.println(c1 == c2);//true 一个类的字节码对象只有一个
    		
    //方式2 任意对象的静态的class属性
    Class c3 = Person.class;
    		
    //方式3 通过Class类的静态方法forName()
    Class c4 = Class.forName("com.reflect.Person");
    System.out.println(c1==c4);
    

    获取类信息

    //获取字节码文件对象
    Class c = Class.forName("com.reflect.Person");
    
    //获取无参构造器
    Constructor con = c.getConstructor();
    		
    //通过构造器对象创建对象
    Object obj = con.newInstance();
    
     //获取有参构造器
    //传递参数的字节码对象
    Constructor con = c.getConstructor(String.class,int.class);
    //3.创建对象
    Object obj = con.newInstance("xyg",15);
    //-----------------------------------------------------------------------------
    //获取单个公开成员
    Field ageField = c.getField("age");
    	
     //获取单个私有成员
    Field nameField = c.getDeclaredField("name");
    nameField.setAccessible(true);//设置为true才能访问
    
    //通过Field对象设置成员值
    Constructor con = c.getConstructor();
    Object obj = con.newInstance();
    ageField.set(obj, 12);//给obj对象的field字段赋值12
    nameField.set(obj, "xyg");
     //-----------------------------------------------------------------------------
     //获取class
    Class c = Class.forName("com.reflect.Person");
    //拿到对象
    Constructor con = c.getConstructor();
    Object obj = con.newInstance();
    
    //获取单个无参方法
    Method m1 = c.getMethod("show", null);
     //无参传递null
    m1.invoke(obj, null);
    
    //获取单个有参方法
    Method m2 = c.getMethod("function", String.class);
    m2.invoke(obj, "xyg");
    
     //获取多参有返回值
    Method m3 = c.getMethod("returnValue", String.class,int.class);
    System.out.println(m3.invoke(obj, "林青霞",38));
                    
     //获取私有方法
    Method m4 = c.getDeclaredMethod("hello",null);
    m4.setAccessible(true);
    m4.invoke(obj, null);
    

    通过反射越过泛型检查

    ArrayList<Integer> list = new ArrayList<>();
    list.add(24);
    list.add(432);
    //		list.add("fdjsl");ERROR
    Class c = list.getClass();
    Method m = c.getDeclaredMethod("add", Object.class);//这里要接受Object的字节码
    m.invoke(list, "hello");
    m.invoke(list, "world");
    System.out.println(list);
    
  • 相关阅读:
    安全测试 + 渗透测试 Xmind 要点梳理
    Confluence wiki——CentOS6.8搭建详解
    Flask从入门到做出一个博客的大型教程(一)
    基于Cat的分布式调用追踪
    Elastic-job使用及原理
    Jmeter模拟不同带宽
    Mybatis中parameterType、resultMap、statementType等等配置详解(标签中基本配置详解)
    SQLyog Enterprise常用快捷键
    MyBatis 与 Spring Data JPA 选择谁?
    Springboot集成mybatis(mysql),mail,mongodb,cassandra,scheduler,redis,kafka,shiro,websocket
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/10479203.html
Copyright © 2020-2023  润新知