java 反射之静态and动态代理

java

首先说一下我们什么情况下使用代理?

(1)设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。

(2)我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。

(3)Spring的AOP机制就是采用动态代理的机制来实现切面编程。
---------------------

一,静态代理

package org.rcisoft.business.reflectDemo;

/**

* @author: wsj

* @date: 2018/10/13

* @time: 18:18

*/

//静态代理

//接口

public interface StaticReflect {

void show();

}

//被代理类

class Nike implements StaticReflect{

@Override

public void show() {

System.out.println("nike开始生产衣服...");

}

}

//代理类

class ProxyClass implements StaticReflect{

StaticReflect sr;

public ProxyClass(StaticReflect st){

this.sr = st;

}

@Override

public void show() {

System.out.println("代理类开始执行,收代理费$10");

sr.show();

}

}

class testStaticReflect{

public static void main(String[] args) {

Nike nick = new Nike();

ProxyClass proxyClass = new ProxyClass(nick);

proxyClass.show();

}

}

二,动态代理

package org.rcisoft.business.reflectDemo;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

/**

* @author: wsj

* @date: 2018/10/13

* @time: 18:42

*/

public interface ProxyTest {

}

//反射之动态代理

//接口

interface Subject{

void action();

}

//被代理类

class RealSubject implements Subject{

@Override

public void action() {

System.out.println("动态被代理类开始执行啦!...");

}

}

//代理类

class MyInvocationHandler implements InvocationHandler {

Object obj; //实现了被代理类的对象的说明

public Object blind(Object obj) {

this.obj = obj;

return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);

}

@Override

public Object invoke(Object proxy, Method method, Object[] args)

throws InvocationTargetException, IllegalAccessException {

return method.invoke(obj, args);

}

}

class testProxyMethod{

public static void main(String[] args) {

RealSubject realSubject = new RealSubject();

MyInvocationHandler myInvocationHandler = new MyInvocationHandler();

Subject subject = (Subject) myInvocationHandler.blind(realSubject);

realSubject.action();

}

}

以上是 java 反射之静态and动态代理 的全部内容, 来源链接: utcz.com/z/391167.html

回到顶部