67,515
社区成员
发帖
与我相关
我的任务
分享
public interface User
{
public void setName(String name);
public String getName();
}
接口实现类UserImpl:
public class UserImpl
implements User
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String toString()
{
return "User name is:" + name;
}
}
代理类UserProxy:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserProxy
implements InvocationHandler
{
private Object target;
/**
* 绑定委托对象并返回一个代理类
* @param target
* @return
*/
public Object bind(Object target)
{
this.target = target;
//取得代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass()
.getInterfaces(), this); //要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
Object result = null;
System.out.println("代理开始");
//执行方法
System.out.println("Method name is:" + method.getName());
//这里get和set,只要对set拦截就可以了的
/*if (method.getName().contains("getName"))
{
result = method.invoke(target, args);
result = ((String) result).replaceAll("\\s", "");
}
else */
if (method.getName().contains("setName") && null != args[0])
{
String args1 = (String) args[0];
args[0] = args1.replaceAll("\\s", "");
}
result = method.invoke(target, args);
System.out.println("代理结束");
return result;
}
}
测试类TestProxy:
public class TestProxy
{
public static void main(String[] args)
{
UserProxy proxy = new UserProxy();
User user = (User) proxy.bind(new UserImpl());
user.setName("This is Tommy");//入参传的是带空格的
System.out.println(user);//打印的不带空格
String name = user.getName();//取得的也不带空格
System.out.println("User's name is :" + name);
}
}