zoukankan      html  css  js  c++  java
  • 有关java之反射的使用

    复制代码
     1 public class Demo02 {  
     2     @SuppressWarnings("all")  
     3     public static void main(String[] args) throws Exception {  
     4         // 另一个com.sg.myReflection.bean包下的User类  
     5         String path = "com.sg.myReflection.bean.User";  
     6         try {  
     7             Class clazz = Class.forName(path);  
     8           // User.class  new User().getClass()
     9             // 获取类名  
    10             String strName01 = clazz.getName();// 获取完整类名com.sg.myReflection.bean.User  
    11             String strName02 = clazz.getSimpleName();// 直接获取类名 User  
    12   
    13             // 获取属性  
    14             Field[] field01 = clazz.getFields(); // 返回属性为public的字段  
    15             Field[] field02 = clazz.getDeclaredFields(); // 返回所有的属性  
    16             Field field03 = clazz.getDeclaredField("id"); // 获取属性为id的字段  
    17   
    18             // 获取普通方法  
    19             Method[] Method01 = clazz.getDeclaredMethods(); // 返回public方法  
    20             Method method = clazz.getDeclaredMethod("getId", null); // 返回getId这个方法,如果没有参数,就默认为null  
    21   
    22               
    23             // 获取构造方法  
    24             User u1 = (User) clazz.newInstance(); // 获取无参的构造函数这里的前提的保证类中应该有无参的构造函数  
    25             // 获取参数为(int,String,int)的构造函数  
    26             Constructor c2 = clazz.getDeclaredConstructor(int.class, String.class, int.class);  
    27             // 通过有参构造函数创建对象  
    28             User u2 = (User) c2.newInstance(1001, "小小", 18);  
    29   
    30               
    31             // 通过反射调用普通方法  
    32             User u3 = (User) clazz.newInstance();  
    33             Method method03 = clazz.getDeclaredMethod("setId", int.class);  
    34             method.invoke(u3, 1002); // 把对象u3的id设置为1002  
    35   
    36               
    37               
    38             // 通过反射操作普通的属性  
    39             User u4 = (User) clazz.newInstance();  
    40             Field f = clazz.getDeclaredField("name");  
    41             f.setAccessible(true); // 设置属性可以直接的进行访问  
    42             f.set(u4, "石头");  
    43   
    44         } catch (ClassNotFoundException e) {  
    45             e.printStackTrace();  
    46         }  
    47     }  
    48 }  
    复制代码
    复制代码
      1 public static void getObjectValue(Object object) throws Exception {  
      2         //我们项目的所有实体类都继承BaseDomain (所有实体基类:该类只是串行化一下)  
      3         //不需要的自己去掉即可  
      4         if (object != null && object instanceof BaseDomain) {//if (object!=null )  ----begin  
      5             // 拿到该类  
      6             Class<?> clz = object.getClass();  
      7             // 获取实体类的所有属性,返回Field数组  
      8             Field[] fields = clz.getDeclaredFields();  
      9   
     10             for (Field field : fields) {// --for() begin  
     11                 System.out.println(field.getGenericType());//打印该类的所有属性类型  
     12   
     13                 // 如果类型是String  
     14                 if (field.getGenericType().toString().equals(  
     15                         "class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名  
     16                     // 拿到该属性的gettet方法  
     17                     /** 
     18                      * 这里需要说明一下:他是根据拼凑的字符来找你写的getter方法的 
     19                      * 在Boolean值的时候是isXXX(默认使用ide生成getter的都是isXXX) 
     20                      * 如果出现NoSuchMethod异常 就说明它找不到那个gettet方法 需要做个规范 
     21                      */  
     22                     Method m = (Method) object.getClass().getMethod(  
     23                             "get" + getMethodName(field.getName()));  
     24   
     25                     String val = (String) m.invoke(object);// 调用getter方法获取属性值  
     26                     if (val != null) {  
     27                         System.out.println("String type:" + val);  
     28                     }  
     29   
     30                 }  
     31   
     32                 // 如果类型是Integer  
     33                 if (field.getGenericType().toString().equals(  
     34                         "class java.lang.Integer")) {  
     35                     Method m = (Method) object.getClass().getMethod(  
     36                             "get" + getMethodName(field.getName()));  
     37                     Integer val = (Integer) m.invoke(object);  
     38                     if (val != null) {  
     39                         System.out.println("Integer type:" + val);  
     40                     }  
     41   
     42                 }  
     43   
     44                 // 如果类型是Double  
     45                 if (field.getGenericType().toString().equals(  
     46                         "class java.lang.Double")) {  
     47                     Method m = (Method) object.getClass().getMethod(  
     48                             "get" + getMethodName(field.getName()));  
     49                     Double val = (Double) m.invoke(object);  
     50                     if (val != null) {  
     51                         System.out.println("Double type:" + val);  
     52                     }  
     53   
     54                 }  
     55   
     56                 // 如果类型是Boolean 是封装类  
     57                 if (field.getGenericType().toString().equals(  
     58                         "class java.lang.Boolean")) {  
     59                     Method m = (Method) object.getClass().getMethod(  
     60                             field.getName());  
     61                     Boolean val = (Boolean) m.invoke(object);  
     62                     if (val != null) {  
     63                         System.out.println("Boolean type:" + val);  
     64                     }  
     65   
     66                 }  
     67   
     68                 // 如果类型是boolean 基本数据类型不一样 这里有点说名如果定义名是 isXXX的 那就全都是isXXX的  
     69                 // 反射找不到getter的具体名  
     70                 if (field.getGenericType().toString().equals("boolean")) {  
     71                     Method m = (Method) object.getClass().getMethod(  
     72                             field.getName());  
     73                     Boolean val = (Boolean) m.invoke(object);  
     74                     if (val != null) {  
     75                         System.out.println("boolean type:" + val);  
     76                     }  
     77   
     78                 }  
     79                 // 如果类型是Date  
     80                 if (field.getGenericType().toString().equals(  
     81                         "class java.util.Date")) {  
     82                     Method m = (Method) object.getClass().getMethod(  
     83                             "get" + getMethodName(field.getName()));  
     84                     Date val = (Date) m.invoke(object);  
     85                     if (val != null) {  
     86                         System.out.println("Date type:" + val);  
     87                     }  
     88   
     89                 }  
     90                 // 如果类型是Short  
     91                 if (field.getGenericType().toString().equals(  
     92                         "class java.lang.Short")) {  
     93                     Method m = (Method) object.getClass().getMethod(  
     94                             "get" + getMethodName(field.getName()));  
     95                     Short val = (Short) m.invoke(object);  
     96                     if (val != null) {  
     97                         System.out.println("Short type:" + val);  
     98                     }  
     99   
    100                 }  
    101                 // 如果还需要其他的类型请自己做扩展  
    102   
    103             }//for() --end  
    104               
    105         }//if (object!=null )  ----end  
    106     }  
    107   
    108     // 把一个字符串的第一个字母大写、效率是最高的、  
    109     private static String getMethodName(String fildeName) throws Exception{  
    110         byte[] items = fildeName.getBytes();  
    111         items[0] = (byte) ((char) items[0] - 'a' + 'A');  
    112         return new String(items);  
    113     }
    复制代码
  • 相关阅读:
    SQL学习
    FOR XML PATH
    IOS学习网址
    weak nonatomic strong等介绍(ios)
    UVALive3045 POJ2000 ZOJ2345 Gold Coins
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA439 POJ2243 HDU1372 ZOJ1091 Knight Moves【BFS】
    UVA10905 Children's Game
  • 原文地址:https://www.cnblogs.com/the-wang/p/10233936.html
Copyright © 2011-2022 走看看