静态代理与动态代理
2018-03-01 22:47
246 查看
静态代理与动态代理
1.静态代理
注意两点:实现类与代理类实现相同的接口;实现类中拥有的方法,代理类中必须拥有;
Subject.javapublic interface Subject {
public void print();
}RealSubject.javapublic class RealSubject implements Subject{
@Override
public void print() {
System.out.println(this.getClass().getName());
}
}
ProxySubject0.javapublic class ProxySubject0 implements Subject {
private RealSubject realSubject;
public ProxySubject0(RealSubject realSubject) {
super();
this.realSubject = realSubject;
}
@Override
public void print() {
//附加操作。。。
realSubject.print();
//其他附加操作。。。
}
}
Main0.javapublic class Main0 {
public static void main(String[] args){
Subject sub=new ProxySubject0(new RealSubject());
sub.print();
}
}2.动态代理
2.1 JDK动态代理
主要使用到Proxy类和InvocationHandler接口
Subject.javapublic interface Subject {
public void print();
}
RealSubject.javapublic class RealSubject implements Subject{
@Override
public void print() {
System.out.println(this.getClass().getName());
}
} ProxySubject.javapublic class ProxySubject implements InvocationHandler{
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
super();
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行动态代理的逻辑
System.out.println("before");
Object result=null;
try{
result=method.invoke(realSubject, args);
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
System.out.println("after");
}
return result;
}
}测试类:Main.javapublic class Main {
public static void main(String[] args) {
Subject sub=(Subject)Proxy.newProxyInstance(
Main.class.getClassLoader(), new Class[]{Subject.class},new ProxySubject(new RealSubject()));
sub.print();
}
}
2.2 Cglib动态代理
Subject.javapublic interface Subject {
public void print();
}
RealSubject.javapublic class RealSubject implements Subject{
@Override
public void print() {
System.out.println(this.getClass().getName());
}
}
CglibProxy.javaimport java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("before");
Object object=null;
try {
object=proxy.invokeSuper(obj, args);
} catch (Exception e) {
e.printStackTrace();
throw e;
}finally{
System.out.println("after");
}
return object;
}
}测试类Main0.javaimport net.sf.cglib.proxy.Enhancer;
public class Main0 {
public static void main(String[] args) {
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(RealSubject.class);
enhancer.setCallback(new CglibProxy());
Subject subject=(Subject)enhancer.create();
subject.print();
}
}使用到的jar包:cglib-2.2.2.jar,asm-3.3.1.jar
2.3 jdk动态代理与cglib代理的区别
jdk是基于接口的代理方式,代理的为被代理类的接口的接口方法;
cglib代理是基于继承的代理方式(生成的代理类继承被代理类),无法对static,final类进行代理,无法对private,static方法代理
1.静态代理
注意两点:实现类与代理类实现相同的接口;实现类中拥有的方法,代理类中必须拥有;
Subject.javapublic interface Subject {
public void print();
}RealSubject.javapublic class RealSubject implements Subject{
@Override
public void print() {
System.out.println(this.getClass().getName());
}
}
ProxySubject0.javapublic class ProxySubject0 implements Subject {
private RealSubject realSubject;
public ProxySubject0(RealSubject realSubject) {
super();
this.realSubject = realSubject;
}
@Override
public void print() {
//附加操作。。。
realSubject.print();
//其他附加操作。。。
}
}
Main0.javapublic class Main0 {
public static void main(String[] args){
Subject sub=new ProxySubject0(new RealSubject());
sub.print();
}
}2.动态代理
2.1 JDK动态代理
主要使用到Proxy类和InvocationHandler接口
Subject.javapublic interface Subject {
public void print();
}
RealSubject.javapublic class RealSubject implements Subject{
@Override
public void print() {
System.out.println(this.getClass().getName());
}
} ProxySubject.javapublic class ProxySubject implements InvocationHandler{
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
super();
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行动态代理的逻辑
System.out.println("before");
Object result=null;
try{
result=method.invoke(realSubject, args);
}catch(Exception e){
e.printStackTrace();
throw e;
}finally{
System.out.println("after");
}
return result;
}
}测试类:Main.javapublic class Main {
public static void main(String[] args) {
Subject sub=(Subject)Proxy.newProxyInstance(
Main.class.getClassLoader(), new Class[]{Subject.class},new ProxySubject(new RealSubject()));
sub.print();
}
}
2.2 Cglib动态代理
Subject.javapublic interface Subject {
public void print();
}
RealSubject.javapublic class RealSubject implements Subject{
@Override
public void print() {
System.out.println(this.getClass().getName());
}
}
CglibProxy.javaimport java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class CglibProxy implements MethodInterceptor{
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("before");
Object object=null;
try {
object=proxy.invokeSuper(obj, args);
} catch (Exception e) {
e.printStackTrace();
throw e;
}finally{
System.out.println("after");
}
return object;
}
}测试类Main0.javaimport net.sf.cglib.proxy.Enhancer;
public class Main0 {
public static void main(String[] args) {
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(RealSubject.class);
enhancer.setCallback(new CglibProxy());
Subject subject=(Subject)enhancer.create();
subject.print();
}
}使用到的jar包:cglib-2.2.2.jar,asm-3.3.1.jar
2.3 jdk动态代理与cglib代理的区别
jdk是基于接口的代理方式,代理的为被代理类的接口的接口方法;
cglib代理是基于继承的代理方式(生成的代理类继承被代理类),无法对static,final类进行代理,无法对private,static方法代理
相关文章推荐
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- 代理模式(静态代理、动态代理)
- JAVA设计模式(三)静态与动态代理模式
- 静态代理和动态代理的理解
- 代理设计模式之动态代理与静态代理
- Java动态代理学习1——静态代理
- java,代理模式(静态代理,动态代理)
- 静态代理 和 JDK动态代理
- java 静态代理和动态代理
- 代理模式之静态代理与动态代理
- 浅谈静态代理和动态代理
- Java 静态代理和动态代理
- Spring AOP的实现原理—— 静态代理和动态代理
- java的静态代理和动态代理实现笔记
- Android下静态代理和动态代理解析
- java的代理模式(静态和动态代理)
- Spring的代理模式(静态代理和动态代理)
- AOP之静态代理VS动态代理
- 从java 反射看延迟加载(代理模式)(六)——动态代理与静态代理
- java静态和动态代理原理