动态代理 -- 不用手动编写一个代理对象,不需要编写与目标对象相同的方法,在运行时内存中动态生成代理对象。

动态代理创建的核心代码:
TargetInterface objProxy = (TargetInterface) Proxy.newProxyInstance(
Target.class.getClassLoader(),//与目标对象相同的类加载器
new Class[]{TargetInterface.class},
new InvocationHandler() {

@Override
//proxy 即该代理对象
//method 代理对象的方法,里面封装这接口中的所有方法
//args 目标对象的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object invoke = method.invoke(new Target(), args); //调用的是目标对象相应的方法
return invoke; //返回值是代理对象的,如果想要代理对象的返回值与目标对象的返回值一致的话,使用return invoke;
}
});
动态代理的用处:解决全局乱码问题
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
/**
* 使用动态代理完成乱码问题
*/
HttpServletRequest proxyInstance = (HttpServletRequest) Proxy.newProxyInstance(
req.getClass().getClassLoader(),
req.getClass().getInterface(),
new InvocationHandler() {

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if("getParameter".equals(method.getName())){
String invoke = (String) method.invoke(req, args);//乱码
invoke = new String(invoke.getBytes("ISO-8859-1"), "UTF-8");
System.out.println(invoke);
return invoke;
}
return method.invoke(req, args);
}
});
chain.doFilter(proxyInstance, resp);
}

时间: 2024-10-08 09:04:20

动态代理 -- 不用手动编写一个代理对象,不需要编写与目标对象相同的方法,在运行时内存中动态生成代理对象。的相关文章

聊聊高并发(四)Java对象的表示模型和运行时内存表示

在继续了解Java内存模型之前,最好先理解Java对象的内存表示.在网上搜了下Java对象内存表示,说得都不够系统和到位.之前看了<Hotspot实战>一书,对JVM如何表示对象这块说得挺好,推荐一下.如果不理解JVM运行时的各种内存区域以及Java调用的过程,那么很难把Java内存模型理解到位.这个是一个比较大的主题,以后会陆续写一些JVM相关的.这里单把Java对象的内存拿出来聊聊,文中内容都基于Hotspot虚拟机. Hotspot主要是用C++写的,所以它定义的Java对象表示模型也是

对象与运行时内存

和大多数猴子一样,我原来也抵触对原理的学习, 后来发现掌握了原理才有了那种了然于胸,运筹帷幄的感觉,也就是顿悟. 这里主要介绍Java对象与运行时内存的知识. java运行时内存 Program Counter Registe(程序计数器): 记录当前线程执行字节码的位置,相当于行号指示器,为线程私有的. Java Virtual Machine Stacks(java虚拟机栈): 存放方法出口信息.局部变量表(对象引用.基本类型数据等),为线程私有的. Native Method Stack(

面向对象_对象建立时内存中的变化

建立一个对象在内存中会做什么事 1.因为new用到了Person.class所以会先找到Person.class文件并加载到内存中 2.执行该类中的static代码块,如果有的话,给Person.class类进行初始化 3.在堆内存中开辟空间,分配内存地址 4.在堆内存中建立对象的特有属性,并进行默认初始化 5.对属性进行显示初始化 6.对对象进行构造代码块初始化 7.对对象进行对应的构造函数初始化 8.将内存地址赋给内存中的p变量 对象初始化过程: 先是默认初始化-------显示初始化---

对象处理方法, 首先内存中要要有对象原形 才可以返回对象

struct op( name = "ccc") coc = #( cc = op name: 20 , op name: "name" ) --- 保存数组配置 o = gt_max_namespace.gt_cl_hp_fileiooutin(); o. setfile "c://t.txt" coc ccc= o.getfile "c://t.txt" --#("(op name:20)", &quo

[译文]运行时利用反射动态地创建类的实例

介绍 通常我们使用类的名称创建一个实例/类的对象,例如,如果我有一个名为 User 的类,我们会去这样创建这个类. 1 User UR = new User(); 2 UR.ID = 1; 3 UR.Name = "Kailash"; 但如果有人你在让你在应用程序运行时或者通过字符串作为类名创建一个类的实例,你将如何做? 别担心,微软.Net 框架提供了一种解决方案. 在System.Reflection名称空间的 Assembly类和System名字空间的和Activator 类可以

java虚拟机2.运行时内存对象

对象的创建 虚拟机遇到一条new指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过. 在类加载检查通过后,接下来虚拟机将为新生对象分配内存.对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从java堆中划分出来. 假设java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那分配内存就仅仅是把那个指针向空闲空间那边挪动

ASP.NET中Literal控件的使用方法(用于向网页中动态添加内容)

原文:https://www.jb51.net/article/82855.htm 可以将 Literal 控件用作网页上其他内容的容器.Literal 控件最常用于向网页中动态添加内容.简单的讲,就是可以把 HTML 代码写到 Literal 控件上,直接呈现出来. 一.常见Literal属性 属性 描述 Text 指定 Literal 控件中显示的文本.在用户的浏览器中,这会显示为 HTML. Mode 指定控件如何处理添入其中的标记. 二.基础用法 前台 LiteralTest.aspx

首先,编写一个类ChongZai,该类中有3个重载的方法void print();其次, 再编写一个主类来测试ChongZai类的功能

//计算器 jisuanqi jsq=new jisuanqi(); System.out.println("2和3 中最大的是:"+jsq.max(2, 3)); System.out.println("2/3/10 中最大的是:"+jsq.max(2, 3, 10)); System.out.println("2.3和4.5 中最大的是:"+jsq.max(2.3, 4.5)); public class jisuanqi { // 属性 /

13.首先,编写一个类ChongZai,该类中有3个重载的方法void print();其次, 再编写一个主类来测试ChongZai类的功能。

package java1; //计算器 public class Jisuanqi { //属性 //型号,品牌等 //重载 //1.方法同名不同参 //2.返回类型和重载无关 //3.多态的一种表现形式 //4.构造方法也可重载: //方法 //加法运算 public int Jia(int a,int b) { return a+b; } public int Jia(int x,int y,int z) { return x+y+z; } //浮点数加法 public double Ji