java静态代理和动态代理

先上图:

静态代理是一个接口,两个实现类,其中一个类是被代理类(Student),另外一个类是代理类MyProxy

代码:

public interface Person {
    public void showName(String name);
}
public class Student implements Person {
    @Override
    public void showName(String name) {
        System.out.println(name);
    }
}
public class MyProxy implements Person {
    private Person person;

    public MyProxy(Person person) {
        this.person = person;
    }

    @Override
    public void showName(String name) {
        System.out.println("Before");
        person.showName(name);
        System.out.println("After");
    }
}
public class Test {
    public static void main(String[] args) {
        Person person = new Student();
        MyProxy proxy = new MyProxy(person);
        proxy.showName("Jerny");
    }
}

动态代理(有接口的情况):一个接口,两个实现类+回调类InvocationHandler。其中,一个实现类是被代理对象,另外一个实现类是通过newProxyInstance通过传入的参数动态生成的实现类,它是代理对象,此代理对象调用回调类的invoke方法。回调类中注入类被代理对象。

代码:

public class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) {
        System.out.println("Before");
        Object o = method.invoke(target, args);
        System.out.println("After");
        return o;
    }
}
public class Test {
    public static void main(String[] args) {
        Person person = new Student();
        MyInvocationHandler h = new MyInvocationHandler(person);
        person = (Person) Proxy.newProxyInstance(person.getClass().getClassLoader, person.getClass().getInterfaces(), h);
        person.showName("Jerny");
    }
}

动态代理(无接口的情况):动态生成被代理类的子类作为代理对象,代理对象作为子类可以覆盖父类的非final的方法,当调用代理类的方法时会回调invoke方法,invoke方法写在接口MethodInterceptor的实现类中。

代码:

public class Employee {
	public void work() {
		System.out.println("work...");
	}
}
public class MyMethodInterceptor implements MethodInterceptor{
	private Object target;
	
	public Object createProxyInstance(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(this.target.getClass());
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		System.out.println("Before");
		Object o = methodProxy.invoke(target, args);
		System.out.println("After");
		return o;
	}
}
public class Test {
    public static void main(String[] args) {
        Employee emp = new Employee();
		MyMethodInterceptor m = new MyMethodInterceptor();
		emp = (Employee)m.createProxyInstance(emp);
		emp.work();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值