静态代理

package staticproxy;

/**
* 接口
* @author newtouch
*
*/
public interface IHello { public void sayHello(); public String doSomethong(String s); }

  

package staticproxy;

/**
* 实现类
* @author newtouch
*
*/
public class Hello implements IHello{ @Override
public void sayHello() {
System.out.println("zhangxiongfeng"); } @Override
public String doSomethong(String s) { return s;
} }

  

package staticproxy;

/**
* 静态代理类
* @author newtouch
*
*/
/**
*
* @author newtouch
*
* 问题 如果接口中有多个方法 静态代理中 就会有多重新代理的方法
*
*/
public class StaticProxy { private IHello iHello; public StaticProxy(IHello iHello) {
this.iHello=iHello;
} public void sayHello() {
iHello.sayHello();
} public String doSomethong(String s) { return iHello.doSomethong(s);
} }

  

package staticproxy;

public class Test {

	public static void main(String[] args) {

		IHello iHello = new Hello();

		StaticProxy staticProxy = new StaticProxy(iHello);

		staticProxy.sayHello();

		System.out.println(staticProxy.doSomethong("zhangxiongfeng"));

	}

}  

动态代理:

package proxy;

/**
* 接口
* @author newtouch
*
*/
public interface IHello { public void sayHello(); public String doSomethong(String s); }

  

package proxy;

public class Hello implements IHello{

	@Override
public void sayHello() {
System.out.println("zhangxiongfeng"); } @Override
public String doSomethong(String s) { return s;
} }

  

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class DynamicProxy implements InvocationHandler { private IHello iHello; DynamicProxy(IHello iHello) {
this.iHello = iHello;
} /**
* 调用接口 IHello接口中的 任何方法都是要用下面的方法执行
*
* 可以不用像静态代理中 每个方法都必须重写
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//  在代理真实对象前我们可以添加一些自己的操作
System.out.println("before rent house"); System.out.println("Method:" + method); // 当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
method.invoke(iHello, args); //  在代理真实对象后我们也可以添加一些自己的操作
System.out.println("after rent house"); return null;
}
}

  

package proxy;

import java.lang.reflect.Proxy;

public class Test {

	public static void main(String[] args) {
// TODO Auto-generated method stub IHello iHello = new Hello(); DynamicProxy dynamicProxy = new DynamicProxy(iHello); IHello hello = (IHello) Proxy.newProxyInstance(dynamicProxy.getClass().getClassLoader(), iHello.getClass().getInterfaces(), dynamicProxy); // hello.sayHello(); System.out.println(hello.doSomethong("zhangxf")); } }

  动态代理执行:

before rent house
Method:public abstract void proxy.IHello.sayHello()
zhangxiongfeng
after rent house

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class ProxyFactory<T> { private T t; private InvocationHandler invocationHandler; public ProxyFactory(T t,InvocationHandler invocationHandler) {
this.t = t;
this.invocationHandler = invocationHandler;
} public T newProxyInstance() { return (T)Proxy.newProxyInstance(invocationHandler.getClass().getClassLoader(), t.getClass().getInterfaces(), invocationHandler); }
} 动态工厂

  

Java动态代理和静态代理区别的更多相关文章

  1. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  2. Java中的代理模式--静态代理和动态代理本质理解

    代理模式定义:为其他对象提供了一种代理以控制对这个对象的访问. 代理模式的三种角色: Subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求. Real ...

  3. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  4. Java设计模式学习06——静态代理与动态代理(转)

    原地址:http://blog.csdn.net/xu__cg/article/details/52970885 一.代理模式 为某个对象提供一个代理,从而控制这个代理的访问.代理类和委托类具有共同的 ...

  5. Java动态代理与静态代理以及它能为我们做什么

    相信我们在网上和平时学习和工作中或多或少都接触过Java的代理模式,经常听到什么静态代理.动态代理的一些名词.但我们是否真的很清楚这些呢?至少我在面试时,发现很多人并不很清楚. 首先代理比较好理解,就 ...

  6. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  7. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  8. java 基础 --- 动态代理和静态代理

    问题  : 代理的应用场景是什么 动态代理的底层原理是什么,为什么只能继承接口 概述 代理模式是设计模式的一种,简单地说就是调用代理类的方法实际就是调用真实类的方法.这种模式在AOP (切面编程)中非 ...

  9. Java代理(静态代理、JDK动态代理、CGLIB动态代理)

    Java中代理有静态代理和动态代理.静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在运行期确定的.静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性. J ...

  10. SpringAOP用到了什么代理,以及动态代理与静态代理的区别

    spring aop (面向切面)常用于数据库事务中,使用了2种代理. jdk动态代理:对实现了接口的类生成代理对象.要使用jdk动态代理,要求类必须要实现接口. cglib代理:对类生成代理对象. ...

随机推荐

  1. Mybatis if标签判断大小

    1.if标签语法 <select...> SQL语句1 <if test="条件表达式"> SQL语句2 </if> </select&g ...

  2. 解决linux下不生成core dump文件

    core dump的概念: A core dump is the recorded state of the working memory of a computer program at a spe ...

  3. USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)

    CYPRESS的USB外设控制器CY7C68013A是一款广泛应用于USB打印机,手机,存储设备,USB测试等多个领域的经典产品.该产品符合USB2.0协议规范,支持full speed和high s ...

  4. android地址位置

    有精度纬度确定地理位置 latitude: 23.1352888---longitude: 113.3297445 调用Google API接口: URL: http://maps.google.cn ...

  5. 【CUDA学习】结构体指针复制

    内核函数中要用data结构作用参数 typedef struct { int* value; int* num; } data; //host端 data* h_input; h_input=(dat ...

  6. c数据结构第一个公式写程序计算给定多项式在给定点x处的值

    假设x=2,那么a的数组有几个, 那n就是根据索引来的 假设数组[, , , , ] n就是0, 1, 2,,3, 4 f = + ( + ( + ( + ()))) f = + ( + ( + ( ...

  7. 【转】【Python】python使用urlopen/urlretrieve下载文件时出现403 forbidden的解决方法

    第一:urlopen出现403 #!/usr/bin/env python # -*- coding: utf- -*- import urllib url = "http://www.go ...

  8. 【C#】使用DWM实现无边框窗体阴影或全透窗体

    1.无边框窗体阴影,win7(需要开启Aero效果)及以上系统 public class LdwmForm : Form { public LdwmForm() { Initialize(); } / ...

  9. java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

    hibernate查询结果条数集 原写法: Integer count = (Integer )session.createQuery(hql).uniqueResult(); 报错:java.lan ...

  10. Android wifi powersave

    使用高通平台的查看power save的功能. 一般是控制WCNSS_qcom_cfg.ini文件的两个参数gEnableBmps,gEnableImps. BMPS: Beacon mode pow ...