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   
     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     }
  • 相关阅读:
    洛谷 1195 口袋的天空
    洛谷1955 程序自动分析
    【洛谷3295】[SCOI2016]萌萌哒
    洛谷2024 食物链
    八数码问题
    Codeforces Round #442 (Div. 2)
    Oracle 中truncate与delete的区别
    git命令提交步骤和解决冲突的
    git 更新代码到本地
    12、Python中的包
  • 原文地址:https://www.cnblogs.com/shamo89/p/8477379.html
Copyright © 2011-2022 走看看