ホームページ >Java >&#&チュートリアル >Java プロキシ モードの詳細な分析 (画像とテキスト)
この記事では、主に Javaプロキシ モードの関連情報を詳しく紹介します。興味のある方は参考にしてください。
プロキシ モードは、最も一般的に使用される抽象ロール: 実際のオブジェクトとプロキシ オブジェクトの共通インターフェイスを宣言します。メッセージの送信を例として取り上げます:
//接口定义 public interface MessageHandler { public void sendMessage(String msg); } //通过Email方式发送消息的实现类 public class EmailMessage implements MessageHandler { @Override public void sendMessage(String msg) { // TODO Auto-generated method stub System.out.println(msg+" send!!"); } } //消息处理的代理类 public class MessageProxy implements MessageHandler { private static int count; private MessageHandler emailMsg; @Override public void sendMessage(String msg) { // TODO Auto-generated method stub if(checkMessage(msg)) { if(emailMsg==null) emailMsg=new EmailMessage(); count++; emailMsg.sendMessage(msg); System.out.println("Message sent:"+count); } } private boolean checkMessage(String msg) { return msg != null && msg.length() > 10; } } //调用类 public class MainClass { private static void runProxy(MessageHandler handler) { handler.sendMessage("message for test"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub runProxy(new EmailMessage()); System.out.println("++++++++++++++++Pjroxy++++++++++++++++++"); runProxy(new MessageProxy()); } } //输出 message for test send!! ++++++++++++++++Pjroxy++++++++++++++++++ message for test send!! Message sent:1この例では、メッセージ送信プロセス中にさまざまな必要な追加の処理メソッドを簡単に追加できます。また、電子メールによるメッセージ送信を SMS 送信に置き換えるなど、メッセージ処理メソッドを簡単に置き換えることもできます。発信者に気付かれずにメッセージを送信できます。プロキシは、特定のオブジェクトから追加の操作を分離したい場合に非常に役立ちます。特に、簡単に変更できるようにしたい場合や、特定のオブジェクトのメソッドが実行される前に追加の操作を挿入したい場合に便利です。
動的プロキシ
lang.reflect パッケージの下にあり、通常、次の 2 つのクラスが含まれます:
Protected Proxy(InvocationHandler h):
Constructor、推定内部 h 割り当てに使用されます。 静的クラス getProxyClass (ClassLoader ローダー、Class[] インターフェイス): プロキシ クラスを取得します。ここで、ローダーはクラス ローダー、インターフェイスは実際のクラスが所有するすべてのインターフェイスの配列です。
public class SmsMessage implements MessageHandler { @Override public void sendMessage(String msg) { // TODO Auto-generated method stub System.out.println("SMS Message :" + msg+" sent !"); } } //动态代理类 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicMessageProxy implements InvocationHandler { private static int count; private MessageHandler msgHandler; public DynamicMessageProxy(MessageHandler handler) { msgHandler = handler; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println("++++++++=============+++++++++"); System.out.println("proxy:" + proxy.getClass()); System.out.println("method:" + method); System.out.println("++++++++=============+++++++++"); if (args != null && args.length == 1 && checkMessage((String) args[0])) { count++; System.out.println("Message sent:" + count); return method.invoke(msgHandler, args); } return null; } private boolean checkMessage(String msg) { return msg != null && msg.length() > 10; } } //下面是调用 import java.lang.reflect.Proxy; public class MainClass { private static void runProxy(MessageHandler handler) { handler.sendMessage("message for test"); } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // runProxy(new EmailMessage()); // System.out.println("++++++++++++++++Proxy++++++++++++++++++"); // runProxy(new MessageProxy()); MessageHandler handler = new EmailMessage(); runProxy(handler); MessageHandler proxy = (MessageHandler) Proxy.newProxyInstance( MessageHandler.class.getClassLoader(), new Class[] { MessageHandler.class }, new DynamicMessageProxy( handler)); runProxy(proxy); System.out.println("++++++++++++++++++++++++++++++++++"); // 短信方式 handler = new SmsMessage(); runProxy(handler); proxy = (MessageHandler) Proxy.newProxyInstance(MessageHandler.class .getClassLoader(), new Class[] { MessageHandler.class }, new DynamicMessageProxy(handler)); runProxy(proxy); } } //下面为以上方法的输出: message for test send!! ++++++++=============+++++++++ proxy:class $Proxy0 method:public abstract void MessageHandler.sendMessage(java.lang.String) ++++++++=============+++++++++ Message sent:1 message for test send!! ++++++++++++++++++++++++++++++++++ SMS Message :message for test sent ! ++++++++=============+++++++++ proxy:class $Proxy0 method:public abstract void MessageHandler.sendMessage(java.lang.String) ++++++++=============+++++++++ Message sent:2 SMS Message :message for test sent !
以上例子中,通过调用Proxy.newProxyInstance方法创建动态代理对象,该方法需要传入一个 类加载器、一组希望代理实现的接口列表、InvocationHandler 接口的一个具体实现。动态代理可以将所有调用重定向到调用处理器,通常我们会向该处理器传递一个时间对象的引用。invoke()方法中传递进来了代理对象,当你需要区分请求来源时这是非常有用的,例如你可以通过判断传入的方法名屏蔽掉某些方法的执行!动态代理机制并不是会很频繁使用的方法,它通常用来解决一些特定情况下的问题,因此不要盲目的为了使用而使用,要根据自己的实际需求来决定!
以上がJava プロキシ モードの詳細な分析 (画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。