利用反射动态代理

1.被代理类

Person.java

package com.fill.jdbc;

public class Person {
	private int age;
	private String name;
	private String sex;
	public String ss;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(int age, String name, String sex) {
		super();
		this.age = age;
		this.name = name;
		this.sex = sex;
		System.out.println("有参方法");
	}
	private void sy(){
		System.out.println("测试私有");
	}
	public Person(){
		System.out.println("无参方法");
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}

}

2.接口

Subject.java

package dynamalDemo;
/*
 * 要代理的主题接口
 */
public interface Subject {
	public void miai();
	public void paipai2();
}
3.动态代理类

DynaProxy.java

package dynamalDemo;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/*
 * 动态代理类
 * 动态代理:即通过代理类:Proxy的代理,接口和实现类之间
 * 可以不直接发生联系,而可以在运行期(Runtime)实现动态关联.
 * java动态代理主要使用java.lang.reflect包中的两个类
 * a.InvocationHandler类
 * b.Proxy类
 * *动态代理其实是在运行时生成class,所以,我们必须提供一组interface,然后告诉他class已经实现了
 * 这些interface,而且在生成Proxy的时候,必须给他提供一个hander,让他来接管实际工作
 */
public class DynaProxy implements InvocationHandler {

	private Object target;//对代理对象,表示不知道会代理什么对象
	public DynaProxy(Object target){
		this.target=target;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// TODO Auto-generated method stub
		Object obj=null;
		before();
		obj=method.invoke(target, args);//正在调用业务方法
		after();
		return obj;
	}
	private void before(){
		System.out.println("为代理人匹配如意郎君");
	}
	private void after(){
		System.out.println("本次相亲结束");
	}
}

4.开始测试:

Test.java

package dynamalDemo;

import java.lang.reflect.Proxy;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Person p=new Person("水水");
		DynaProxy dynaProxy=new DynaProxy(p);
		//Proxy 提供用于动态代理类和实例的静态方法
		//它还是由这些方法创建的所有动态代理类的超类
		Subject s=(Subject) Proxy.newProxyInstance(p.getClass().getClassLoader(),p.getClass().getInterfaces(),dynaProxy);
		s.miai();
		s.paipai2();
	}

}


总结:经过对比,静态代理只能代理自己继承的那个接口的其他继承者。动态代理可以代理多个对象.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值