Java反射用法

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值