反射通常使用场景
1、动态生成对象,应用于工厂模式中
2、应用于动态监听jar包代码或者无法改变代码中内容
(1)直接获取对象属性,并重现建立指向关系型反射
(2)通过类接口,进行重新设定引用,但只监听接口方法型反射
===
浅谈一下第二种的内容的理解
private void intRefect()
{
//获取Class
Class<?> className = Class.forName("");
//也可以用 类名.getClass();形式,这里adc是属性名称
Field field = className.getDeclaredField("adc");
//注意设置 才可以执行调用
field.setAccessible(true);
//field如果是静态变量可以下面这样来实现 重新建立对象指向关系
//相当于对adc属性赋值
field.set(null,对应field相应类型的对象);
//field如果是静态变量,可以下面这样,获取此对象
//相当于获取此adc属性的值
Object object = field.get(null);
//field不是静态变量的时候,则需要传递field属性所在的类的对象实例
field.set(对象实例,对应field相应类型的对象);
//从对象实例中,获取field名称的对象
field.get(对象实例);
//对于获取的某些属性对象是 **容器** 或者 **通用类形式**,我们则可以直接调用其内部方法!!!比较简便
//对于方法的调用
Method method = className.getDeclaredMethod("方法名");
//静态方法可以
Object objectRet = method.invoke(null,参数或者无参数(Object[])null);
// 或者对于无参数静态方法可以这样调用
Object objectRet1 = method.invoke(null);
//非静态方法可以
Object objectRet2 = method.invoke(具体的对象实例,参数或者无参数(Object[])null);
//对于接口代理,并添加额外操作的实现
/**
* 条件是
* 1、需要获取此对象
* 2、我们想要 来对此对象实现的接口方法,添加额外操作
* 需要做的内容是
* 根据已有此对象,重新进行new一个代理对象,并设置引用关系
*/
//假设传入的对象为objectInstance
Object objectInstance= new Object();
final Object instanceProxy;
instanceProxy = Proxy.newProxyInstance(objectInstance.getClass().getClassLoader(),objectInstance.getClass().getInterfaces(),new MyHandlerInvocation(objectInstance));
//将我们重写建立的 新的属性 设置到 object中,,,即之前object对象中有一个
// objectInstance对象,后面我们改成 我们设置了监听的对象 instanceProxy
field.set(object,instanceProxy);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
private static class MyHandlerInvocation implements InvocationHandler
{
//指向被代理对象
private Object object;
public MyHandlerInvocation(Object object)
{
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//添加额外操作
//之后也要将代理操作执行
Object retObject = method.invoke(this.object,args);
return retObject;
}
}
版权声明:本文为u011523180原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。