zoukankan      html  css  js  c++  java
  • 反射常用API

    反射所有功能都是通过class API来实现的

    class常用API有:

    1。class.GETINTERFACES();获得这个类实现的接口。

    2。class。getMethods()

    Method常用反射API

    1.Method.invoke(),方法自己调用自己,方法调用必须通过object.method()方式,method对象本身是无法调用自己的。

    2.Method.getParameterTypes()获得参数类型

    3.Method.getReturnType()获得返回值类型

    4.Method.getParameterCount()获得方法的参数个数

    5.Method.getName()获得方法名称

    6.Method.getExceptionTypes()获得方法抛出哪些异常

    7.method.getAnnotation()获得注解

    Field常用反射API

    1.field.getAnnotations()返回属性的注解

    通过反射可以获得属性Field。

    1、定义一个实体类

    [java] view plain copy
     
     print?
    1. package cn.com.refelct;  
    2.   
    3. public class Emp {  
    4.   
    5.     private int no;  
    6.     private int age;  
    7.     public String address;  
    8.     public String name;  
    9.       
    10.     public Emp(int no, int age, String address, String name) {  
    11.         super();  
    12.         this.no = no;  
    13.         this.age = age;  
    14.         this.address = address;  
    15.         this.name = name;  
    16.     }  
    17.       
    18. }  

    2、获取Field

    [java] view plain copy
     
     print?
    1. Field[] publicFields = emp.getClass().getFields();  
    2.     for(Field field:publicFields){  
    3.         System.out.println(field);  
    4.     }  

    上述方式得到的结果如下:

    [java] view plain copy
     
     print?
    1. public java.lang.String cn.com.refelct.Emp.address  
    2. public java.lang.String cn.com.refelct.Emp.name  

    可见:该种方式只能得到public属性的字段。

    为了得到所有的Field,见如下代码:

    [java] view plain copy
     
     print?
    1. Field[] privateAndPublicFields = emp.getClass().getDeclaredFields();  
    2.         for(Field field:privateAndPublicFields){  
    3.             System.out.println(field);  
    4.         }  

    上述方式得到的结果如下:

    [java] view plain copy
     
     print?
    1. private int cn.com.refelct.Emp.no  
    2. private int cn.com.refelct.Emp.age  
    3. public java.lang.String cn.com.refelct.Emp.address  
    4. public java.lang.String cn.com.refelct.Emp.name  


    3、获取Field的值

    通过Filed,可以获取对应的值:

    (1)获取某个public属性的值

    [java] view plain copy
     
     print?
    1. Field nameField = emp.getClass().getField("name");  
    2. System.out.println("name的值:" + nameField.get(emp));  

    得到的结果如下:

    [java] view plain copy
     
     print?
    1. name的值:yy  


    (2)获取某个private属性的值

    [java] view plain copy
     
     print?
    1. Field ageField = emp.getClass().getDeclaredField("age");  
    2. System.out.println("age的值:" + ageField.get(emp));  

    结果如下:

    [java] view plain copy
     
     print?
    1. Exception in thread "main" java.lang.IllegalAccessException: Class cn.com.refelct.ReflectField can not access a member of class cn.com.refelct.Emp with modifiers "private"  
    2.     at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)  
    3.     at java.lang.reflect.Field.doSecurityCheck(Field.java:960)  
    4.     at java.lang.reflect.Field.getFieldAccessor(Field.java:896)  
    5.     at java.lang.reflect.Field.get(Field.java:358)  
    6. <span style="white-space:pre">    </span>at cn.com.refelct.ReflectField.main(ReflectField.java:44)  

    可见:对于private的属性,访问不了。

              做如下修改:

    [java] view plain copy
     
     print?
    1. Field ageField = emp.getClass().getDeclaredField("age");  
    2. ageField.setAccessible(true);  
    3. System.out.println("age的值:" + ageField.get(emp));  

    通过暴力反射的方式进行值的获取。

    结果如下:

    [java] view plain copy
     
     print?
    1. age的值:25  



    另外:对于static字段,当获取其值时,传入的对象为null或者任何一个实体类的对象。

  • 相关阅读:
    ArrayBlockingQueue
    mysql数据库引擎
    数据库主从复制,分库分表
    Java并发工具类-Semaphore,Exchanger
    分片策略
    kafka
    关于数据库设计
    生产者消费者模式

    Callable、Future和FutureTask
  • 原文地址:https://www.cnblogs.com/panxuejun/p/7087404.html
Copyright © 2011-2022 走看看