您的位置:首页 > 编程语言 > Java开发

【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法

2017-08-14 22:18 716 查看

【Java进阶-Java动态代理与AOP】03 创建动态类的实例对象及调用其方法

创建动态类的实例对象

由上一篇文章中分析,动态代理类只有一个构造方法

com.sun.proxy.$Proxy4(java.lang.reflect.InvocationHandler)

因此,我们需要了解InvocationHandler这个接口,其中只有一个invoke方法,签名如下:

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;


proxy 表示代理对象

method 表示动态类传递过来的方法

args 表示动态类传递过来的参数

更多详细的内容留在以后的文章中说明。

下面,我们创建动态类的实例,代码如下:

/**
* 通过代理创建对象
* @param clazzProxy1
* @return
*/
private static Collection newInstanceByProxy(Class clazzProxy1) throws Exception {
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
Collection coll = (Collection)constructor.newInstance(new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
return coll;
}


调用动态类实例的方法

调用动态类实例的方法以及分析过程如下:

/**
* 创建代理类的实例
* 代理类的实例方法调用的限制
*/
@Test
public void newInstanceByProxyTest()
throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Class clazzProxy1 = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
Constructor constructor = clazzProxy1.getConstructor(InvocationHandler.class);
Collection coll = (Collection)constructor.newInstance(new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return null;
}
});
System.out.println(coll); // null,但并非是空指针,而是返回值是 null 字符串
System.out.println(coll.toString());
//int size = coll.size();
//调用有返回值的方法会出现异常,因为返回值是 invoke的返回结果 null,null无法转换为int或其他类型,
//但是可以转换为 void 类型,即无返回值
coll.clear();
}


InvocationHandler中的invoke方法的返回值,就是动态类的方法的返回值。

如果InvocationHandler中的invoke的返回值类型不能强转为动态类中方法的返回值的类型,将会抛出异常。

参考:

Java多线程与并发库高级应用教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐