反射

什么是反射?     

 剖析Java类中的各个组成部分映射成一个个java对象     

为什么用反射?      

多用于框架和组件,写出复用性高的通用程序           

1.Class类.      Class代表的就是我们的字节码文件.      

三种方式.       

1.类名.class      

2.对象.getClass();      

3.Class.forName();             

在开发中创建使用第三种  Class.forName();为什么?       

这种方式耦合度低,没有依赖性.            

-----------------------------------------     

2.Constructor(构造器对象)      构造器的作用就是用来创建对象的。      

  Constructor代表的是构造器对象,我们得到它后就可以实例化对象.            

  1.怎样得到Constructor对象.       

    getConstructor()-----得到指定的构造器       

    getConstructors();---得到所有的构造器                 

  2.关于Constructor的注意事项       

    1.如果构造方法不是public。那么要获取其构造器对象使用  getDeclaredConstuctor()方法.              

    2.对于私有化权限,在使用前必须设置权限检查.        

    public void setAccessible(boolean flag)        值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查              

    3.在开发中,我们在得到Class时,一般会直接实例化类的对象.  

3.Field

4.Method           

  1.            

  2.对于static方法怎样调用?      

   静态方法调用时不需要使用对象,直接写null          

   staticMethod.invoke(null,参数);       

  3.方法的参数如果是数组怎样调用?               

  在调用invoke时,第二个参数强制转换成Object,或在外面在包装一层数组.

例子:

创建一个Map集合.
      map.put("name","tom");
      map.put("sex","男");
      map.put("address","北京");
      
     Person类.
      class Person{
       
       private String name;
       private String sex;
       private String address;
       
       get/set方法.
      }
      
     要求,使用反射,将map集合中key值与Person类中属性名相同的用key的value对Person类的属性赋值.
     
     不使用Field类,使用 Method类操作.

反射
 1 package com.hexiaolin.work;
 2 
 3 import java.lang.reflect.Method;
 4 import java.util.HashMap;
 5 import java.util.Map;
 6 
 7 import org.junit.Test;
 8 
 9 public class ReflectDemo {
10 
11     @Test
12     public void show() {
13         Map<String, String> map = new HashMap<String, String>();
14         map.put("name", "tom");
15         map.put("sex", "男");
16         map.put("address", "北京");
17 
18         Class clazz = Person.class;
19         try {
20             Person person = (Person) clazz.newInstance();
21             for (Map.Entry<String, String> entry : map.entrySet()) {
22                 String key = entry.getKey();
23                 String fristChart = key.substring(0, 1);
24                 String otherChart = key.substring(1, key.length());
25                 
26                 StringBuilder methodSetName = new StringBuilder("set");
27                 methodSetName.append(fristChart.toUpperCase()).append(otherChart);
28                 
29                 StringBuilder methodGetName = new StringBuilder("get");
30                 methodGetName.append(fristChart.toUpperCase()).append(otherChart);
31                 Method methodSet = clazz.getMethod(methodSetName.toString(), String.class);
32                 methodSet.invoke(person, entry.getValue());
33                 
34                 Method methodGet = clazz.getMethod(methodGetName.toString());
35                 System.out.println(methodGet.invoke(person, null));
36             }
37         } catch (Exception e) {
38             e.printStackTrace();
39         }
40     }
41 }
42 
43 class Person {
44     private String name;
45     private String sex;
46     private String address;
47 
48     public String getName() {
49         return name;
50     }
51 
52     public void setName(String name) {
53         this.name = name;
54     }
55 
56     public String getSex() {
57         return sex;
58     }
59 
60     public void setSex(String sex) {
61         this.sex = sex;
62     }
63 
64     public String getAddress() {
65         return address;
66     }
67 
68     public void setAddress(String address) {
69         this.address = address;
70     }
71 
72 }
反射

反射

上一篇:好长时间没有写过原生的js了 给大家先来一个简单选项卡功能吧 第一回写博客 请大家见谅哈


下一篇:一些js的基本操作