什么是反射?
剖析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 }