proxy动态代理的实现类
package org.sunjs.proxy.main;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.sunjs.proxy.annotation.LogAnnotation;
import org.sunjs.proxy.utils.Logger;
/**
* 代理类
* 这里必须实现InvocationHandler接口
*/
public class LogProxy implements InvocationHandler {
private LogProxy() {
// 不让外部调用
}
private Object target;
// 这里的参数o就是要代理的对象
public static Object getInstance(Object o) {
LogProxy pm = new LogProxy();
pm.target = o;// 赋值,设置这个代理对象
// 通过Proxy的方法创建代理对象,第一个参数是要代理对象的ClassLoader装载器
// 第二个参数是要代理对象实现的所有接口
// 第三个参数是实现了InvocationHandler接口的对象
// 此时的result就是一个代理对象,代理的是o
Object result = Proxy.newProxyInstance(o.getClass().getClassLoader(), o
.getClass().getInterfaces(), pm);
return result;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//如果下边不判断方法名的话,就会拦截到被代理对象的所有方法的执行。
// if(method.getName().equalsIgnoreCase("add")){
// //输入日志
// Logger.info("动态代理日志信息.");
// }
//2.自己定义一个annotation的类(LogAnnotation),进行注解拦截。
if(method.isAnnotationPresent(LogAnnotation.class)){
LogAnnotation la = method.getAnnotation(LogAnnotation.class);
Logger.info(la.value()+"--->执行的是"+method.getName()+"方法.");
}
Object obj = method.invoke(target, args);
return obj;
}
}
自己定义的一个Logger输出日志信息类
package org.sunjs.proxy.utils;
import java.util.Date;
/**
* 输出日志
*/
public class Logger {
public static void info(String message){
System.out.println(new Date()+"--------->"+message);
}
}
自定义annotation,注解使用
package org.sunjs.proxy.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* 自定义一个annotation
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
public String value() default "";
}
接口IUserDao
package org.sunjs.proxy.dao;
import org.sunjs.proxy.annotation.LogAnnotation;
/**
* 接口
*/
public interface IUserDao {
@LogAnnotation("annotation注解日志信息")
public void delete(Integer id);
// @LogAnnotation("test")
public Object load(Integer id);
}
实现类UserDaoImpl
package org.sunjs.proxy.dao;
/**
* 仿数据库dao操作类
*/
public class UserDaoImpl implements IUserDao {
@Override
public void delete(Integer id) {
System.out.println("执行类数据库删除操作成功!");
}
@Override
public Object load(Integer id) {
System.out.println("从数据库查询了id为["+id+"]的数据信息!");
return null;
}
}
测试主类main函数
package org.sunjs.proxy.main;
import org.sunjs.proxy.dao.IUserDao;
import org.sunjs.proxy.dao.UserDaoImpl;
/**
* 测试类
*/
public class Main {
public static void main(String[] args) {
IUserDao userDao = new UserDaoImpl();
//创建的动态代理.
IUserDao log = (IUserDao)LogProxy.getInstance(userDao);
//具体哪个会输出日志信息,请看我在接口IUserDao上的annotation注解即可。
//对于LogProxy这个类的写法还需要好好研究研究
log.delete(1);//执行删除方法
log.load(1);//执行查询方法
}
}
这个程序我已经打包上传了 和这个一模一样。 下载地址
版权属于: 技术客
官方地址: http://www.sunjs.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。