java动态代理的原理

java

在许多mvc框架中,经常用到注解来实现面向切面(aop)的编程。面向切面编程,可以对业务逻辑中各部分进行分离,提高程序的重用性,降低各逻辑业务部分的耦合度。

jdk中利用反射原理使用Proxy类对对象进行代理。

jdk动态代理的应用前提是,目标类基于统一的接口。

接口类:

public interface Service {

public void doService();

}

继承Service的实现类:

 1 public class ServiceImpl1 implements Service {

2 @Override

3 public void doService() {

4 System.out.println("impl 1 do the service....");

5

6 }

7 }

8 public class ServiceImpl2 implements Service {

9 @Override

10 public void doService() {

11 System.out.println("impl 2 do the service...");

12 }

13 }

代理工厂类的getService方法,传入参数是被代理的service的class。创建InvocationHandler类对象,对被代理对象的方法进行处理。

 1 public <T extends Service> T getService(Class<T> clazz) {

2 String simpleName = clazz.getSimpleName();

3 String implName = getImplName(simpleName);

4 try {

5 final T service = (T) Class.forName(implName).newInstance();

6 T froxyService = (T) Proxy.newProxyInstance(service.getClass().getClassLoader(),

7 service.getClass().getInterfaces(), new InvocationHandler() {

8

9 @Override

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

11 throws Throwable {

12 System.out.println("do something before proxy method...");

13 Object obj = method.invoke(service, args);

14 System.out.println("do something after proxy method...");

15 return obj;

16 }

17 });

18 return froxyService;

19 } catch (Exception e) {

20 e.printStackTrace();

21 throw new RuntimeException();

22 }

23 }

测试类和结果:

 1 public class ProxyTest {

2 public static void main(String[] args) {

3 Factory factory = new Factory();

4 Service impl1 = new ServiceImpl1();

5 Service proxyImpl1 = factory.getService(impl1.getClass());

6 proxyImpl1.doService();

7 Service impl2 = new ServiceImpl2();

8 Service proxyImpl2 = factory.getService(impl2.getClass());

9 proxyImpl2.doService();

10 }

11 }

12

13 结果是:

14 do something before proxy method...

15 impl 1 do the service....

16 do something after proxy method...

17 do something before proxy method...

18 impl 2 do the service...

19 do something after proxy method...

以上是 java动态代理的原理 的全部内容, 来源链接: utcz.com/z/391059.html

回到顶部