首页 > 代码库 > 黑马程序员——Java高新技术代理
黑马程序员——Java高新技术代理
代理
动态代理有一个核心接口InvocationHandler,里面只有一个方法,用于封装实际类的方法。和一个工具类Proxy可以为你建立一个委托类的实例。
普通代理
很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦。代理就为其他类提供了一种控制其对象的方法。代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法。
interface Solution{
public void doSomething();
}
//委托类Demo实现了接口
class Demo implements Solution{
public void doSomething() {
System .out.println( "do something"); }
}
//代理类实现了委托了一样的接口
class ProxyDemo implements Solution{
private Demo demo ;
private ProxyDemo(){};
//委托类的对象成为代理类的内在属性
public ProxyDemo( Demo demo){this .demo =demo ;}
public void doSomething() {
System .out.println( "————前处理————" );
demo. doSomething();
System .out.println( "————后处理————" );
}}
public class ProxyTest {
public static void main (String[] args) {
Solution solution=new ProxyDemo(new Demo());
solution.doSomething ();
}
}//运行结果
/*————前处理————
do something
————后处理————*/
动态代理
使用代理后,无论是调用Demo还是ProxyDemo都可以达到使用doSomething方法的目的,而且ProxyDemo还提供了一些额外的功能,提高了功能的扩展性,使程序更灵活。但是上例中,使用代理必须明确委托类和方法,扩展性不够。动态代理可以在未知委托类和方法的时候就写好程序,见招拆招,运行时才确定类,提高扩展性。
interface Solution{
public void doSomething();
}
//委托类Demo实现了接口
class Demo implements Solution{
public void doSomething() {
System .out.println( "do something"); }
}
//动态代理
class ProxyDemo2 implements InvocationHandler {
//不确定委托类,使用接口引用
private Solution obj ;
private ProxyDemo2 (){}
public ProxyDemo2( Solution obj ){this .obj =obj ;}
public Object invoke( Object proxy, Method method, Object [] args )
throws Throwable {
// TODO Auto-generated method stub
System . out. println( "————前处理2————" );
obj. doSomething ();
System . out. println( "————后处理2————" );
return null ;
}
}
public class ProxyTest {
public static void main ( String[] args ) {
Demo demo =new Demo ();
Class cla =demo .getClass ();
InvocationHandler handle =new ProxyDemo2 (demo );
//动态代理就是在运行的时候才确立的类。见招拆招
Solution solution2 =( Solution )Proxy .newProxyInstance
( cla. getClassLoader() ,cla .getInterfaces (), handle );
solution2 .doSomething ();
}
} //运行结果
/*
————前处理2————
do something
————后处理2————
*/
动态代理有一个核心接口InvocationHandler,里面只有一个方法,用于封装实际类的方法。和一个工具类Proxy可以为你建立一个委托类的实例。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。