jdk动态代理

自学spring的主观理解总结,有错误,请指正
代理模式中存在三种角色:抽象角色、真实角色、代理角色

创建model

package com.shuting.model;

public class User {

	package com.shuting.model;

public class User {

	private String username;
	private Integer age;
	private String gender;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", age=" + age + ", gender=" + gender + "]";
	}
}

创建抽象角色

package com.shuting.service;

public interface UserService {

	public void save();
	
	public void update();
}

创建真实角色

真实角色实现抽象角色

package com.shuting.service.impl;
/*
 * 业务实现类中的所有方法的操作交给代对象
 */
import com.shuting.model.User;
import com.shuting.service.UserService;

public class UserServlceImpl implements UserService {

	private User User = null;
	
	public User getUser() {
		return User;
	}

	public void setUser(User user) {
		User = user;
	}

	@Override
	public User save() {
		System.out.println("保存对象");
		return User;
	}

	@Override
	public User update() {
		System.out.println("更改对象");
		return User;
	}
}

创建代理角色

代理角色需要实现InvocationHandler接口,再实现借口而下的invoke方法

package com.shuting.proxy;

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

import com.shuting.service.impl.UserServlceImpl;

public class JDKProxy implements InvocationHandler {
/*
 * 代理对象
 */
	private Object obj;
/*
 * newProxyInstance静态方法根据参数loader、Interfaces调用方法getProxyClass(Loader,Interfaces),创建了一个代理类$Proxy0,该类中能够实现被代理类中的业务方法的代理
 * 	根据静态方法实例化$Proxy0调用父类构造方法,利用JDKProxy为InvocationHandle对象赋值
 * 
 * 第一个参数:真实对象的类加载器,可以认为是提供类的业务方法给代理对象
 * 第二个参数:$Proxy0实现的接口
 * 第三个参数:回调对象,当$Proxy0代理对象的代理方法invoke被调用时,会委派参数InvocationHandle h去调用当前类中的invoke方法
 */
	public Object createProxy(Object obj1) {
		this.obj = obj1;
		return Proxy.newProxyInstance(this.obj.getClass().getClassLoader(), this.obj.getClass().getInterfaces(), this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println(method.getName());
		Method method2 = obj.getClass().getMethod("getUser", null);
		Object object = method2.invoke(obj, null);
		Object object2 = null;
		if(object != null) {
			object2 = method.invoke(obj, args);
		}else {
			System.out.println("没有登录");
		}
		
		return object2;
	}
}

客户端

package com.shuting.test;

import java.lang.reflect.Field;
import java.lang.reflect.Proxy;

import com.shuting.model.User;
import com.shuting.proxy.JDKProxy;
import com.shuting.service.UserService;
import com.shuting.service.impl.UserServlceImpl;
import com.sun.org.apache.xml.internal.utils.SuballocatedByteVector;

public class Test {

	public static void main(String[] args) {
	
		UserServlceImpl usi = new UserServlceImpl();
		usi.setUser(null);
		UserService createProxy = (UserService)new JDKProxy().createProxy(usi);
		User save = createProxy.update();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值