Java代理示例
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java代理示例,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3293字,纯文字阅读大概需要5分钟。
内容图文
![Java代理示例](/upload/InfoBanner/zyjiaocheng/834/a417649b2bd1437da395c7fff5cc1daa.jpg)
1 接口及其实现
public interface Greeting {
void sayHello(String name);
}
---------------------------------------------
public class GreetingImpl implements Greeting {
@Override
public void sayHello(String name) {
System.out.println( "Hello! " + name );
}
}
---------------------------------------------
public class MainProxy {
public static void main(String[] args) {
// staitcProxy();
jdkDynamicProxy();
// cglibDynamicProxy();
}
private static void staitcProxy(){
Greeting greeting = new GreetingProxy(new GreetingImpl());
greeting.sayHello("jtzen9");
}
private static void jdkDynamicProxy(){
JDKDynamicProxy jdkDynamicProxy = new JDKDynamicProxy(new GreetingImpl());
Greeting greeting = jdkDynamicProxy.getProxy();
greeting.sayHello("jtzen9");
}
private static void cglibDynamicProxy(){
Greeting greeting = CGLibDynamicProxy.getInstance().getProxy(GreetingImpl.class);
greeting.sayHello("jtzen9");
}
}
2 静态代理
public class GreetingProxy implements Greeting {
private GreetingImpl greeting;
public GreetingProxy(GreetingImpl greeting){
this.greeting = greeting;
}
@Override
public void sayHello(String name) {
before();
greeting.sayHello(name);
after();
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
3 JDK动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 1. 首先实现一个InvocationHandler,方法调用会被转发到该类的invoke()方法。
public class JDKDynamicProxy implements InvocationHandler {
// 目标对象
private Object target;
public JDKDynamicProxy(Object target){
this.target = target;
}
// 2. 然后在需要使用Hello的时候,通过JDK动态代理获取Hello的代理对象。
@SuppressWarnings("unchecked")
public <T>T getProxy() {
// 会返回一个实现了指定接口的代理对象,对该对象的所有方法调用都会转发给InvocationHandler.invoke()方法
return (T) Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 指定代理对象的类加载器;
target.getClass().getInterfaces(), // 代理对象需要实现的接口,可以同时指定多个接口
this // 自定义的InvocationHandler,即方法调用的实际处理者,代理对象的方法调用都会转发到这里
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before(); // 前置处理
Object result = method.invoke(target,args);
after(); // 后置处理
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
4 CGLIB动态代理
4.1 pom.xml
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2.2</version>
</dependency>
4.2 Java实现
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CGLibDynamicProxy implements MethodInterceptor {
private static CGLibDynamicProxy instance = new CGLibDynamicProxy();
private CGLibDynamicProxy(){}
public static CGLibDynamicProxy getInstance(){
return instance;
}
@SuppressWarnings("unchecked")
public <T>T getProxy(Class<T> cls) {
return (T) Enhancer.create(cls,this);
}
@Override
public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
before();
Object result = proxy.invokeSuper(target,args);
after();
return result;
}
private void before(){
System.out.println("Before");
}
private void after(){
System.out.println("After");
}
}
内容总结
以上是互联网集市为您收集整理的Java代理示例全部内容,希望文章能够帮你解决Java代理示例所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。