有关java之反射的使用

Posted 千彧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关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     }
技术图片

以上是关于有关java之反射的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java重要技术(24)泛型之使用反射访问参数化类型

深入理解反射

细说java系列之反射

Golang实践录:反射reflect的一些研究及代码汇总

java 反射之静态and动态代理

Java高级之注解反射