动态代理,要扩展String的Trim()方法
希望使用动态代理扩展String的Trim()方法,实现去掉一个字符串的所有空格。例如“ afaf fa fsdf”
把字符串中间的空格去掉。求思路??
[解决办法]
对String类本身改造操作没希望了,可以考虑在get某个String属性的时候,做个拦截处理,返回的内容为去空格的字符串:str.replaceAll("\\s","");
[解决办法]
public interface User
{
public void setName(String name);
public String getName();
}
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;
}
}
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;
}
}
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);
}
}