• Java反射


     java的访问控制是停留在编译层的,它不会在.class文件中留下任何的痕迹,只在编译的时候进行访问控制的检查。因此,通过反射的手段,是可以访问任何包下任何类中的成员,例如,访问类的私有成员也是可能的。

    一、JAVA反射

    1、在运行状态中,对于任意一个类,都能够知道这个类的属性和方法。

    2、对于任意一个对象,都能够调用它的任何方法和属性。

    这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。

    二、反射的作用

    在JAVA中,只要给定类的名字,就可以通过反射机制来获取类的所有信息,可以动态地创建对象和编译。

    反射机制主要提供了以下功能: 

    • 在运行时判断任意一个对象所属的类;

    • 在运行时构造任意一个类的对象;

    • 在运行时判断任意一个类所具有的成员变量和方法;

    • 在运行时调用任意一个对象的方法;

    • 生成动态代理。

    三、反射的原理

    JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

    反射的实现主要借助以下四个类:

    Class:类的对象

    Constructor:类的构造方法

    Field:类中的属性对象

    Method:类中的方法对象

    1、获取类对象:

    通过类名获取Class对象,Class<T> c = Class.forName("类的完全路径");

    通过Class对象获取具体的类对象:Object o = (Object) c.newInstance();

    2、获取类中的构造方法:

    3、获取类中的属性:

    4、获取类中的方法:

    四、代码演示

     1 package reflection;
     2 
     3 import java.io.Serializable;
     4 
     5 public class DemoTest implements Serializable
     6 {
     7     /**
     8      * 注释内容
     9      */
    10     private static final long serialVersionUID = 1L;
    11 
    12     public String name;
    13     public int age;
    14     
    15     public DemoTest()
    16     {
    17     }
    18 
    19     public DemoTest(String name, int age)
    20     {
    21         this.name = name;
    22         this.age = age;
    23     }
    24     
    25     public void sayHello(String param)
    26     {
    27         System.out.println("hello " + param);
    28     }
    29 
    30     public String getName()
    31     {
    32         return name;
    33     }
    34 
    35     public void setName(String name)
    36     {
    37         this.name = name;
    38     }
    39 
    40     public int getAge()
    41     {
    42         return age;
    43     }
    44 
    45     public void setAge(int age)
    46     {
    47         this.age = age;
    48     }
    49 }
    View Code

    测试类:

     1 package reflection;
     2 
     3 import java.lang.reflect.Constructor;
     4 import java.lang.reflect.Field;
     5 import java.lang.reflect.Method;
     6 
     7 public class Test
     8 {
     9     public static void main(String[] args) throws Exception
    10     {
    11         //获取类DemoTest的Class对象
    12         Class<?> c = Class.forName("reflection.DemoTest");
    13         //打印该Class对象对表示的类的名称
    14         System.out.println(c.getName());
    15         //获取该类的实例
    16         System.out.println(c.newInstance());
    17         
    18         System.out.println("-------------------------------------------");
    19         //获取该类实现的接口
    20         Class<?>[] interfaces = c.getInterfaces();
    21         System.out.println(interfaces[0].getName());
    22         
    23         System.out.println("-------------------------------------------");
    24         //获取有参构造函数
    25         Constructor<?> con = c.getConstructor(String.class,int.class);
    26         DemoTest dt = (DemoTest)con.newInstance("xiaoming",12);
    27         System.out.println(dt.getAge());
    28         
    29         System.out.println("-------------------------------------------");
    30         //获取类的成员变量
    31         Field f2 = c.getField("age");
    32         System.out.println(f2);
    33         //获取指定对象上该字段表示的值
    34         System.out.println(f2.get(dt));
    35         
    36         System.out.println("-------------------------------------------");
    37         //获取指定的方法
    38         Method m = c.getMethod("sayHello", String.class);
    39         //反射调用方法,非常重要
    40         m.invoke(dt, "hangzhou");
    41     }
    42 }
    View Code

    测试结果:

     1 reflection.DemoTest
     2 reflection.DemoTest@15db9742
     3 -------------------------------------------
     4 java.io.Serializable
     5 -------------------------------------------
     6 12
     7 -------------------------------------------
     8 public int reflection.DemoTest.age
     9 12
    10 -------------------------------------------
    11 hello hangzhou
    View Code

    五、参考资料

    http://www.cnblogs.com/dongguacai/p/6535417.html (mainly pick from which)

    http://www.cnblogs.com/lzq198754/p/5780331.html(more examples)

  • 相关阅读:
    【GoLang】转载:我为什么放弃Go语言,哈哈
    【GoLang】golang runtime 调度原理
    【GoLang】golang 微服务框架 介绍
    Redis缓存与springboot集成
    Redis分布式锁
    springboot配置文件的配置
    分布式事务之学习
    快速学习
    CAP定理为什么只能同时满足两个
    requestMapping之地址映射
  • 原文地址:https://www.cnblogs.com/z-sm/p/6746210.html
Copyright © 2020-2023  润新知