zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    表单提交
    js 设备判断(移动端pc端 安卓ios 微信)
    js 页面history.back()返回上一页,ios 不重新加载ready的解决办法
    移动端解决单机事件延迟fastclick
    定时器时间动态变化(变速)
    gulp配置(编译压缩转码自动刷新注释全)
    ios和安卓H5交互桥接
    倒计时
    PHP跨域jsonp方式
    1.Redis简介/配置文件
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/10479203.html
Copyright © 2011-2022 走看看