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);
    
  • 相关阅读:
    常用校验码(奇偶校验,海明校验,CRC)学习总结
    .net获取项目根目录方法集合
    C#读写config配置文件
    C# 将ComboBox设置为禁止编辑的方法
    C#中查询数据库时返回的影响行数等于-1?
    UserControl 的一个值得注意的问题 [属性" * "的代码生成失败.错误是:"程序集"*.Version=1.0.0.0,Culture=neutral,..........无标记为序列化"
    C#实现对象序列化为XML
    螺旋矩阵的几种打印形式
    单例模式
    css-text-decoration-skip
  • 原文地址:https://www.cnblogs.com/xiongyungang/p/10479203.html
Copyright © 2011-2022 走看看