一、反射概念(copy)
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
类 实现Dog接口 弄了些访问全限的变量、方法和一个类上的注解 随便介绍一下直接跳过到下一环节。
@re
public class DogVO implements Dog {
public String name;
protected double money;
String colour;
private int age;
public DogVO(String s) {
}
public DogVO() {
}
protected void eat(){
System.out.println("狗在吃");
}
private void sleep(){
System.out.println("狗在睡觉");
}
@Override
public String bark() {
System.out.println("狗在叫");
return "汪~汪~汪";
}
@Override
public void run() {
System.out.println("狗在跑");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour = colour;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "{name:"+name+","+"money:"+money+",colour:"+colour+",age:"+age+"}";
}
}
要想实现反射必须先得到class字节码文件,有以下三种方式
//1.通过类获取
Class<DogVO> class1 = DogVO.class;
//2.通过引用获取
Class<? extends DogVO> class2 = new DogVO().getClass();
//3.通过全限名获取
Class<?> class3 = Class.forName("com.hfl.jkd8_test.entry.vo.DogVO");
获取到class后就可以获取到整个类的信息以下慢慢介绍
1.类名
String name = t.getName();//全限类名
System.out.println("全限类名getName()--"+name);
String simpleName = t.getSimpleName();//简约类名
System.out.println("简约类名getSimpleName()--"+simpleName);
2.构造器
Constructor<?>[] constructors = t.getConstructors();//所有构造器
System.out.println("获取所有构造器 --"+Arrays.asList(constructors));
Constructor<T> constructor = t.getConstructor(String.class);//含参构造
System.out.println(Arrays.asList("对应参数构造器 --"+constructor));
3.变量
Field[] fields = t.getFields();//获取公开的字段
System.out.println("公开的字段 --"+Arrays.asList(fields));
Field[] declaredFields = t.getDeclaredFields();//获取所有的字段
System.out.println("获取所有的字段 --"+Arrays.asList(declaredFields));
4.方法
Method[] methods = t.getMethods();//公共方法
System.out.println("公共方法--"+Arrays.asList(methods));
Method[] declaredMethods = t.getDeclaredMethods();//所有方法
System.out.println("所有方法"+Arrays.asList(declaredMethods));
上面为Methods包含Object方法下面为DeclaredMethods 包含该类所有方法
5.接口、注解
Class<?>[] interfaces = t.getInterfaces();//获取接口
System.out.println("接口 --"+Arrays.asList(interfaces));
Annotation[] annotations = t.getAnnotations();//获取注解
System.out.println("注解 --"+Arrays.asList(annotations));
简单应用下通过Map转换成对应的对象
我先简单说一点,,我用的是java 8 特性 map.forEach+lambda
(s,o) -> {} s,o代表Key,value 你可以当作for()来遍历是一个意思
异常的话我就直接抛出了哈。
public static <T> T MapToBean(Map<String,Object> map,Class<T> t) throws IllegalAccessException, InstantiationException {
Assert.isTrue(map!=null,"Map不能为NULL");
final T bean = t.newInstance();//创建一个实例
map.forEach((s,o)->{
Field field = null;
try {
field = t.getDeclaredField(s);//获取所有的变量
field.setAccessible(true);//开启霸道模式
field.set(bean,o);//赋值
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
});
return bean;
}
main
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {
Map<String,Object> map = new HashMap<>();
map.put("name","bob");
map.put("money",300);
try {
DogVO dogVO = MapToBean(map, DogVO.class);
System.out.println(dogVO.toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}