Java反射用法
获取反射入口(反射操作都要先拿到入口):
常见的反射入口获取方法有三种,分别为:
- Class.forName(全类名(路径));
- 类.class ;
- 对象.getClass();
二:常用方法:
1:拿方法:
反射中拿方法分为:
拿公有方法(getMethod(s)): 拿到本类以及父类,接口中的所有 public方法
拿本类方法(getDeclaredMethod(s)) : 拿到本类中的所有方法,即当要操作private或protected方法时使用
2:拿属性:
同样分为: 拿公有属性(getField(s)) 拿本类属性(getDeclaredField(s))
3:拿构造方法(getConstructor(s))建议结合官方api
三:权限问题:
当要操作private属性值或方法时会出现报错,需要(先)设置其为可操作:属性(方法名).setAccessible(true)
四:越过泛型检查:
我们先定义一个Integer类型的集合:
List<Integer> list = new ArrayList<>();
list.add(11);
list.add(12);
问题:是否可以向list集合中加其他类型的值?
当然可以,我们可以通过反射获取其方法,再调用,如下(异常以抛):
Class<?> listClass = list.getClass();
Method method = listClass.getMethod("add",Object.class);
method.setAccessible(true);
method.invoke(list,"hello");
五:有时也可以简化getter和setter(玩玩就好)
1:setter:
public void setProper(String properName,Object value){
Class<?> clazz = this.getClass();
Field field = null;
try {
field = clazz.getDeclaredField(properName);
field.setAccessible(true);
field.set(this,value);
} catch (Exception e) {
e.printStackTrace();
}
}
2:getter:
public Object getProper(String properName){
Class<?> clazz = this.getClass();
Field field = null;
Object value = null;
try {
field = clazz.getDeclaredField(properName);
field.setAccessible(true);
value = field.get(this);
} catch (Exception e) {
e.printStackTrace();
}
return value;
}