java反射

new一个实例反射写法

//Class.forName
String typeStr="xxxx";
Class<? extends DataSource> clazzType = (Class<? extends DataSource>) Class.forName(typeStr);
Object o = clazzType.newInstance();

获取类中的某个方法

public class A{
    public void foo(String name){
       System.out.println("Hello, "+name);
   }
}
//获取类A中的foo方法
Class<?> clz = Class.forName("A");
Method method = clz.getMethod("foo",//这个是类A的方法名
                              String.class// 这个是类A的方法参数的类型
                              );
//用反射调用类A中的foo方法
Object obj = clz.newInstance();
method.invoke(obj,"zhangsan"); //利用method的模板来调用具体的对象,以及传参

获取类中的字段

Class<?> clz = Class.forName("A");
Field[] field = clz.getDeclaredFields();
for(int i=0;i<field.length;i++){
			//设置是否允许访问,不是修改原来的访问权限修饰词。
			field[i].setAccessible(true);
			field[i].getName();  //这是具体的字段名
}

//如果取一个字段的具体的值,首先得有一个对象
Object obj = clz.newInstance();
Field[] field = clz.getDeclaredFields();
for(int i=0;i<field.length;i++){
			field[i].setAccessible(true);
			field[i].getName();  //这是具体的字段名
			field[i].get(obj);   //这是获取具体的字段的值
			field[i].set(obj,xxx); //这是给字段field[i]设置具体的xxx值 
}

场景

给一个类的final属性修改值-反射

通常一个类的final的属性一旦设置了值,就不允许修改值了,如果你非要修改可以通过反射来操作
在这里插入图片描述

获取一个私有内部类的属性

在这里插入图片描述

获取一个私有静态变量

在这里插入图片描述

获取一个私有final静态变量,并且修改他的值

一个含有静态属性并且是final的成员变量

public abstract class BasePo<T extends BasePo> implements Serializable {
	private static final long serialVersionUID = 1406072669738004984L;
	//想修改这个static final属性
	private static final THintAround iHintAround = SPIExtensionLoader.loadExtension(IHintAnound.class);
}

开始对静态,final的成员变量进行反射修改,由于是final的直接修改会报错,因此需要对该变量先去掉final属性,再进行设置值,最后还原final属性

//获取静态变量
Field nameField = BasePo.class.getDeclaredField("iHintAround");
nameField.setAccessible(true);

//Field里有一个属性modifiers来修改final
Field modifiers = nameField.getClass().getDeclaredField( "modifiers");
modifiers.setAccessible(true);
//去掉final属性
modifiers.setInt(nameField,nameField.getModifiers() &~Modifier.FINAL);
//设置值
nameField.set(po,iHintAround);
//还原final属性
modifiers.setInt(nameField,nameField.getModifiers() &~Modifier.FINAL);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值