Proxy.newProxyInstance的三个参数:
1.ClassLoader loader:加载代理对象的类加载器
2.Class<?>[] interfaces:代理类需要实现的接口,返回值类型即为该接口的类型
3.InvocationHandler h:调用处理器,通过重写其invoke方法扩展被代理对象的方法内容
具体使用:
1.定义接口UserDao
package com.my.dynamicProxy;
public interface UserDao {
int plus(int a ,int b);
String show(String str);
}
2.定义实现类UserDaoImpl
package com.my.dynamicProxy;
public class UserDaoImpl implements UserDao {
@Override
public int plus(int a, int b) {
return a + b;
}
@Override
public String show(String str) {
return "show..." + str;
}
}
3.定义第三个参数的类,实现InvocationHandler接口
package com.my.dynamicProxy;
class UserDaoInvocationHandler implements InvocationHandler{
private Object obj;
public UserDaoInvocationHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("execute before method...method name is: "+method.getName()+"...args are: "+ Arrays.toString(args));
Object result = method.invoke(this.obj, args);
System.out.println("method invoked, result is "+ result);
System.out.println("execute after method...");
return result;
}
}
4.测试类
package com.my.dynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
class JDKProxy {
public static void main(String[] args) {
UserDaoImpl userDaoImpl = new UserDaoImpl();
UserDao userDao = (UserDao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), new Class[]{UserDao.class}, new UserDaoInvocationHandler(userDaoImpl));
userDao.plus(1,2); // proxy.method(args) ,与invoke方法的参数对应
userDao.show("ProxyInstance show ..."); // proxy.method(args) ,与invoke方法的参数对应
}
}
输出:
execute before method…method name is: plus…args are: [1, 2]
method invoked, result is 3
execute after method…
execute before method…method name is: show…args are: [ProxyInstance show …]
method invoked, result is show…ProxyInstance show …
execute after method…