java 中动态代理案例(java.lang.reflect.Proxy)

注:JDK自从1.3版本开始,就引入了动态代理,JDK的动态代理用起来非常简单,但是它有一个限制,就是使用动态代理的对象必须实现一个或多个接口如果想代理没有实现接口的类可以使用CGLIB包。但是本实例只讲第一种代理方式:接口代理方式;第二种代理方法:CGlib代理方法以后讲述;

java中 动态代理的作用:

1、可以在不修改源码的情况下,给方法体补充新的功能

2、动态代理可以实现降低java代码的耦合性,实现不同功能代码的分离


动态代理案例:

      代码1:public interface User

package day27;

public interface User {

    public abstract void add();
    public abstract void delete();
}

      代码2:public class UserImp implements User

package day27;

public class UserImp implements User {

	@Override
	public void add() {
		// TODO Auto-generated method stub
		System.out.println("添加用户");
	}

	@Override
	public void delete() {
		// TODO Auto-generated method stub
		System.out.println("删除用户");
	}

}


    代码3:public class MyInvocationHandler implements InvocationHandler

      

package day27;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {

	Object target;
	 public MyInvocationHandler(Object target) {
		// TODO Auto-generated constructor stub
		this.target = target;
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		System.out.println("权限校验");
		method.invoke(target, args);
		System.out.println("日志记录");
		return null;
	}

}

        代码4:public class UserProxy

package day27;

import java.lang.reflect.Proxy;

public class UserProxy {

	public static void main(String[] args) {
		
		UserImp user = new UserImp();
		user.add();
		user.delete();
		System.out.println("-------------------");
		
		
		MyInvocationHandler m = new MyInvocationHandler(user);
		User u = (User)Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), m);
		
		u.add();
		System.out.println("----");
		u.delete();
		
	}
}
运行结果:
添加用户
删除用户
-------------------
权限校验
添加用户
日志记录
----
权限校验
删除用户
日志记录

java实现动态代理需要哪些步骤:

1、创建某一个类的接口并在接口中声明需要动态代理的抽象方法,如果在接口中没有声明的方法是不能被实现动态代理的;

2、创建一个类并实现接口

3、创建  MyInvocationHandler 类并 实现InvocationHandler 接口,在这个类中我们需要的是创建通用的动态代理的方法(这是关键);

4、创建类 调用动态代理,Proxy.newProxyInstance(loader, interfaces, h)

       MyInvocationHandler m = new MyInvocationHandler(user);
       User u = (User)Proxy.newProxyInstance(user.getClass().getClassLoader(), user.getClass().getInterfaces(), m);

  在使用复合后的 User对象 u 来调用动态代理后的方法   u.add()  u.delete() 等等;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值