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);