zoukankan      html  css  js  c++  java
  • 反射

    反射

      获取Class对象的三种方式

        1.通过对象获取字节码文件对象

          Student stu=new Student();
          Class c1=stu.getClass();
        2.通过类名获取字节码文件对象
          Class c2=Student.class;
        3.通过class类中的forname("完整的包名+类名")
          Class c3=Class.forName("com.oracle.demo02.Student");

      通过反射获取构造方法

        获取所有构造方法:getDeclaredConstructors()  

        获取所有公共构造方法: getConstructors()

        获取私有有参构造方法:getDeclaredConstructor(String.class)

          需要暴力反射:setAccessible(true)

          例:

    Class c=Class.forName("com.oracle.demo02.Student");
            //获取私有有参构造方法
            Constructor con=c.getDeclaredConstructor(String.class);
            //创建对象
            //暴力反射
            //不允许,不提倡暴力反射
            con.setAccessible(true);
            Student stu=(Student) con.newInstance("小红");
            System.out.println(stu);

        获取公共有参构造方法:getConstructor(String.class,int.class)

      通过反射获取成员变量

        获取公共成员变量对象(一个):getField("age");

          一般步骤为:

    1 // 获取字节码文件对象
    2         Class c=Class.forName("com.oracle.demo02.Student");
    3         //获取公共成员变量对象
    4         Field f=c.getField("age");
    5         //快速根据字节码文件对象创建对象
    6         Object obj= c.newInstance();
    7         //给age成员变量赋值
    8         f.set(obj, 18);
    9         System.out.println(f.get(obj));

        获取公共成员变量对象(多个):getDeclaredFields() 

      通过反射获取成员方法

        获取公共有参方法对象一般方法:getMethod("sleep", String.class)

          1.获取字节码文件对象

          2.获取公共有参方法对象、

          3.快速创建对象

          4.调用方法

        例:   

    1 //获取字节码文件对象
    2         Class c=Class.forName("com.oracle.demo02.Student");
    3         //获取公共有参方法对象
    4         Method method=c.getMethod("sleep", String.class);
    5         //快速创建对象
    6         Object obj=c.newInstance();
    7         //调用方法
    8         method.invoke(obj, "小红");

        运行如图所示:

            

       反射擦除

        程序编译后产生的.class文件中是没有泛型约束的,这种现象我们称为泛型的擦除。我们可以通过反射技术,来完成向有泛型约束的集合中,添加任意类型的元素。

        例:定义一个整型集合,通过反射可以存入字符串。

     1         ArrayList<Integer> list = new ArrayList<Integer>();
     2         //添加元素到集合
     3         list.add(new Integer(30));
     4         list.add(new Integer("12345"));
     5         list.add(123);
     6         //list.add("哈哈");//因为有泛型类型的约束
     7         System.out.println(list);        
     8         //通过反射技术,实现添加任意类型的元素
     9         //1, 获取字节码文件对象
    10         Class c = Class.forName("java.util.ArrayList");
    11         
    12         //2, 找到add()方法
    13         Method addMethod = c.getMethod("add", Object.class);
    14         //3,  执行add()方法
    15         addMethod.invoke(list, "哈哈");// list.add("哈哈");
    16         System.out.println(list);


          
          


  • 相关阅读:
    【JavaScript】函数(未完全)
    Spring集成Jersey开发(附demo)
    Tomcat中work目录的作用
    Lucene全文检索(一)
    JS放大镜特效(兼容版)
    S2SH整合
    EL表达式
    JSP和JavaBean
    Cookie和Session
    request对象和response对象
  • 原文地址:https://www.cnblogs.com/zhai113/p/11805194.html
Copyright © 2011-2022 走看看