Java之代理模式

代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法

静态代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package com.teenyda.静态代理;
public class Demo1 {
public static void main(String[] args) {
IInsert stu = new StuDao();
IInsert proxy = new InsertProxy(stu);
proxy.insert("insert into p values....");
proxy.update("update stu set ...");
}
}
interface IInsert {
void insert(String sql);
void update(String sql);
}
class InsertProxy implements IInsert {
private IInsert obj;
public InsertProxy(IInsert obj) {
this.obj = obj;
}
@Override
public void insert(String sql) {
System.out.println("开始执行:");
obj.insert(sql);
System.out.println("执行完毕!");
}
@Override
public void update(String sql) {
System.out.println("开始执行");
obj.update(sql);
System.out.println("执行完毕!");
}
}
class StuDao implements IInsert {
@Override
public void insert(String sql) {
System.out.println(sql);
}
@Override
public void update(String sql) {
System.out.println(sql);
}
}

动态代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package com.teenyda.动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ILogin user = new Usre();
InvocationHandler handler = new UserHandler(user);
Class<?> clazz = user.getClass();
ILogin u = (ILogin)Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), handler);
u.login("张三");
u.killBoss("张三");
大专栏  Java之代理模式 u.update("张三");
}
}
//接口
interface ILogin{
void login(String name);
void killBoss(String name);
void update(String name);
}
//被代理类
class Usre implements ILogin{
@Override
public void login(String name) {
// TODO Auto-generated method stub
System.out.println(name+"登录啦!");
}
@Override
public void killBoss(String name) {
// TODO Auto-generated method stub
System.out.println(name+"击杀boss啦!");
}
@Override
public void update(String name) {
// TODO Auto-generated method stub
System.out.println(name+"升级啦!");
}
}
//代理类
class UserHandler implements InvocationHandler{
private Object obj;
public UserHandler(Object obj) {
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.print("log:");
method.invoke(obj, args);
System.out.println("正在记录!");
return args;
}
}

动态代理-之Cglibcloud-cglib.jar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.teenyda.MethodInterceptor代理;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* @author 作者 E-mail:
* @date 创建时间:2018年1月21日 上午9:55:04
* @version 1.0
* @parameter
* @since
* @return
*/
public class Demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ManagerProxy proxy = new ManagerProxy();
Manager m = (Manager)proxy.getProxy(Manager.class);
m.root();
ManagerProxy p2 = new ManagerProxy();
Super s = (Super)p2.getProxy(Super.class);
s.delete();
}
}
class Manager{
public void root() {
System.out.println("执行root");
}
}
class Super{
public void delete() {
System.out.println("执行删除操作!");
}
}
class ManagerProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class<?> clazz) {
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("截拦!");
proxy.invokeSuper(obj, args);
System.out.println("保存!");
return null;
}
}
原文地址:https://www.cnblogs.com/lijianming180/p/12099773.html