zoukankan      html  css  js  c++  java
  • 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");

  • 相关阅读:
    XML解析
    资源管理
    Android中的动态字符串的处理
    消息提示的三种方式
    程序调控和监视(Logcat,Debug)
    选择改变事件OnCheckedChange
    递归和非递归分别实现求n的阶乘
    递归和非递归分别实现strlen
    编写一个函数 reverse_string(char * string)实现:将参数字符串中的字符反向排列 。(递归实现)
    写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
  • 原文地址:https://www.cnblogs.com/liuwt365/p/4079431.html
Copyright © 2011-2022 走看看