java动态代理
java动态代理是面向接口的,首先创建一个被代理类的接口
package com.kailord.proxy;
public interface Base
{
void doSomeThings();
void params(String param);
}
然后创建一个被代理类
package com.kailord.proxy;
public class User implements Base
{
private int id;
private String name;
public User()
{
this(0, "");
}
public User(int id, String name)
{
this.id = id;
this.name = name;
}
public void doSomeThings()
{
System.out.println(name + " is doing something");
}
public void params(String param)
{
System.out.println(name + " is doing " + param);
}
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
return "User [id=" + id + ", name=" + name + "]";
}
}
下面创建代理类
package com.kailord.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Proxyer<T> implements InvocationHandler
{
private Object obj;
@SuppressWarnings("unchecked")
public T bind(Object obj)
{
this.obj = obj;
return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
Object result = method.invoke(obj, args);
return result;
}
}
然后创建一个主函数测试测代理类
package com.kailord.proxy;
public class Main
{
public static void main(String[] args)
{
Proxyer<User> proxy = new Proxyer<User>();
Base user = proxy.bind(new User(2, "kailord"));
user.doSomeThings();
user.params("今天睡了一大觉");
user.toString();
}
}
输出
kailord is doing something
kailord is doing 今天睡了一大觉
应用确实很简单,只要一个接口一个实现类,一个代理类就OK,大家都知道,jdk的代理必须要接口,此也是其的弊端。通常框架中都不用jdk自带的动态代理。