• Java反射


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

    已知HelloWorld类

     1 package cn.test.HelloWorld;
     2  
     3 public class HelloWorld {
     4     public HelloWorld()
     5     {}
     6     public HelloWorld(String s,Integer i)
     7     {
     8         System.out.println("构造函数(有参数)"+s+i);
     9     }
    10      
    11     private HelloWorld(String s)
    12     {
    13         System.out.println("私有构造函数(有参数)"+s);
    14     }
    15      
    16     public String name="Jack";
    17     private Integer age=23;
    18      
    19     public void print()
    20     {
    21         System.out.println("*******输出函数");
    22     }
    23     public void print(String s,Integer i)
    24     {
    25         System.out.println("******输出函数(有参数)"+s+i);
    26     }
    27      
    28     private void print(String s)
    29     {
    30         System.out.println("*****私有输出函数(有参数)"+s);
    31     }
    32  
    33 }

    1、反射获得class

        有三种方法获得字节码:

    //获得字节码
            //1、最常用
            Class clazz=Class.forName("cn.test.HelloWorld.HelloWorld");
            System.out.println(clazz);
             
            //2、已知类
            Class clazz2=HelloWorld.class;
            System.out.println(clazz2);
             
            //3、已知对象
            HelloWorld helloWorld=new HelloWorld();
            Class clazz3=helloWorld.getClass();
            System.out.println(clazz3);

    2、反射获得构造函数

    1 //获得默认构造
    2         Constructor constructor=clazz.getConstructor();
    3         //执行
    4         Object object= constructor.newInstance();
    5          
    6         //获得有参数的构造函数
    7         constructor=clazz.getConstructor(String.class,Integer.class);
    8         //执行
    9         constructor.newInstance("abcd",1234);

    3、反射获得字段

     1 //快捷方式:获得默认构造函数
     2         Object obj=clazz.newInstance();    
     3         //获得字段
     4         Field field=clazz.getField("name");
     5         //关联
     6         Object value = field.get(obj);
     7         //输出
     8         System.out.println(value);
     9          
    10         //设置值name
    11         field.set(obj, "jack2");
    12         value=field.get(obj);
    13         System.out.println(value);
    14          
    15         //获得私有字段
    16         field=clazz.getDeclaredField("age");
    17         field.setAccessible(true);
    18         value=field.get(obj);
    19         System.out.println(value);
    20          
    21         //设置age
    22         field.set(obj, 25);
    23         value=field.get(obj);
    24         System.out.println(value);

    4、反射获得函数

     1 //实例化
     2         Object obj1=clazz.newInstance();
     3         //获取函数
     4         Method method=clazz.getMethod("print");
     5         //执行
     6         method.invoke(obj1);
     7          
     8         //获取有参函数
     9         method=clazz.getMethod("print", String.class,Integer.class);
    10         //执行
    11         method.invoke(obj1, "dsf",123456);
    12          
    13         //获取私有函数
    14         method=clazz.getDeclaredMethod("print",String.class);
    15         method.setAccessible(true);
    16         method.invoke(obj1, "qwertyui");

  • 相关阅读:
    Android在onCreate()中获得控件尺寸
    Java根据出生年月日获取到当前日期的年月日
    Oracle 取随机数
    filter,orderBy等过滤器
    ng-repeat 指令
    三元表达式、逻辑表达式 与 &&、||的妙用
    ng-switch 指令
    sublime text 3.0 安装 HTML-CSS-JS Prettify
    JS相关环境搭建:Nodejs、karma测试框架、jsDuck、Express
    关于VSS上的项目源码管理的注意问题
  • 原文地址:https://www.cnblogs.com/liuwt365/p/4079431.html
Copyright © 2020-2023  润新知