- 浏览: 142317 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
z360194753:
够详细了
io流 -
yang1527866:
挺详细的
io流 -
anttu:
...
从键盘输入数据 -
haha12333:
谢啦~~~~~
myeclipse 更改项目名 -
幽奇猫:
got it.
thx very much.
foreach
一、动态代理简单实现
1、代理类要实现java.lang.reflect.InvocationHandler接口。
2、并重写接口中的public Object invoke(Object proxy, Method method, Object[] args)方法
proxy: Proxy类对象(本例中没有用的)
method: 被代理类实现接口中的所有方法对象
args: for循环中当前方法参数
3、在invoke方法中加入相应的逻辑,然后执行method.invoke(obj, args);
obj: 被代理对象
args: 底层方法参数
4、产生一个代理对象User user = Proxy.newProxyInstance(arg0, arg1, arg2)
arg0: User类的加载器
arg1: 产生的代理对象要实现的接口
arg2: 代理类的对象
5、例子
public class Run {
public static void main(String[] args) {
NewCar car = new NewCar(); //打印基础语句
TimeProxy ctp = new TimeProxy(); //打印时间语句
ctp.setObj(car);
Car carProxy = (Car)Proxy.newProxyInstance(car.getClass().getClassLoader(), car.getClass().getInterfaces(), ctp);
carProxy.move();//从日子开始语句打印\
}
}
二、动态代理在JDK中的实现
1、Proxy.newProxyInstance(arg0, infce, h)的实现
创建动态代理类及对象
public class Proxy {
public static Object newProxyInstance(Class infce, InvocationHandler h) throws Exception { //JDK6 Complier API, CGLib, ASM
String methodStr = "";
String rt = "\r\n";
Method[] methods = infce.getMethods();
for(Method m : methods) {
methodStr += "@Override" + rt +
"public void " + m.getName() + "() {" + rt +
" try {" + rt +
" Method md = " + infce.getName() + ".class.getMethod(\"" + m.getName() + "\");" + rt +
" h.invoke(this, md);" + rt +
" }catch(Exception e) {e.printStackTrace();}" + rt +
"}";
}
String src =
"package com.bjsxt.proxy;" + rt +
"import java.lang.reflect.Method;" + rt +
"public class $Proxy1 implements " + infce.getName() + "{" + rt +
" public $Proxy1(InvocationHandler h) {" + rt +
" this.h = h;" + rt +
" }" + rt +
" com.bjsxt.proxy.InvocationHandler h;" + rt +
methodStr +
"}";
String fileName =
"d:/src/com/bjsxt/proxy/$Proxy1.java";
File f = new File(fileName);
FileWriter fw = new FileWriter(f);
fw.write(src);
fw.flush();
fw.close();
//compile
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects(fileName);
CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units);
t.call();
fileMgr.close();
//load into memory and create an instance
URL[] urls = new URL[] {new URL("file:/" + "d:/src/")};
URLClassLoader ul = new URLClassLoader(urls);
Class c = ul.loadClass("com.bjsxt.proxy.$Proxy1");
System.out.println(c);
Constructor ctr = c.getConstructor(InvocationHandler.class);
Object m = ctr.newInstance(h);
return m;
}
}
2、invoke(this, md)的实现
public class TimeHandler implements InvocationHandler{
private Object target;
public TimeHandler(Object target) {
super();
this.target = target;
}
@Override
public void invoke(Object o, Method m) {
long start = System.currentTimeMillis();
System.out.println("starttime:" + start);
System.out.println(o.getClass().getName());
try {
m.invoke(target);
} catch (Exception e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
System.out.println("time:" + (end-start));
}
}
3、 m.invoke(target)调用拥有底层方法的对象
4、例子
public class Client {
public static void main(String[] args) throws Exception {
Tank t = new Tank();
InvocationHandler h = new TimeHandler(t);
Moveable m = (Moveable)Proxy.newProxyInstance(Moveable.class, h);
m.move();
}
}
发表评论
-
关于类的初始化顺序
2010-08-20 09:32 688一、一个类中 1、静态变量、静态初始化块 //次两者由书写 ... -
同步异步
2010-08-18 06:31 1079同步和异步的区别 举个例子:普通B/S模式(同步)AJAX技术 ... -
String与StringBuffer
2010-08-18 06:22 8641、String String代表字符 ... -
static块
2010-08-05 16:08 7251、static块与static的联系 static int ... -
开发中的乱码处理
2010-08-05 15:14 835开发环境中的编码要统一:页面、数据库、servlet、js都为 ... -
System.getProperty()
2010-07-31 22:53 703From jdk 1.5.0 documents j ... -
java 日期格式化
2010-07-17 07:56 10741、从数据库里取出Date类型的数据进行格式化 Date d ... -
jsp+servlet分页
2010-04-07 06:45 14151、servlet String pageS ... -
include和forward的区别:
2010-04-06 02:34 1231include和forward的区别: incl ... -
StringBuilder取代StringBuffer
2010-04-02 13:40 739区别在于前者线程不安全 可变的字符 ... -
java filter过滤器乱码问题
2010-03-26 13:18 1316public void doFilter(ServletReq ... -
<转载><感谢>Servlet路径问题
2010-03-25 11:22 1459你的应用访问地址是"http://192.168.0 ... -
java路径问题
2010-03-25 10:50 796一、servlet路径 webapp/ //当前Web工 ... -
Iterator 迭代器 fail-fast
2010-03-24 14:15 1249一、Collection 接口的itera ... -
集合类选择
2010-03-19 05:53 709HashSet、HashMap采用哈希结构,速度快 Arra ... -
JAVA 编程规范
2010-03-17 16:13 808JAVA 编程规范 1. 应用范围 本规范应用于采用 ... -
TreeSet类compareTo()方法重写
2010-03-12 17:39 28161、TreeSet判断两个对象不等的条件: 两个对 ... -
数组初始化
2010-03-12 03:39 859一、定义数组 type[] arrayName; ... -
集合元素的遍历
2010-03-12 03:13 780public void Function() { ... -
集合类
2010-03-11 17:32 819...
相关推荐
"java设计模式简介" 设计模式是解决软件设计问题的套解决方案,描述了对象和类之间的相互作用。设计模式是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用其可以避免一些重复性的工作...
- 动态代理:Java的`java.lang.reflect.Proxy`类可以创建动态代理对象。 - 编写通用工具类:如日志、序列化、测试工具等,需要处理各种未知类型的对象。 总结,Java反射机制是Java平台灵活性和动态性的体现,它极...
19. **java.lang.instrument**:允许Java代理检测JVM上的程序,用于性能监控或代码修改。 20. **java.lang.management**:管理Java虚拟机及其操作系统的接口。 21. **java.lang.ref**:提供引用对象,允许一定程度...
项目名称:Java SSM框架集成日志功能增强Demo 主要编程语言:Java ...项目利用Java动态代理机制,通过实现InvocationHandler接口,巧妙地运用AOP(面向切面编程)实现了日志功能,增强了应用的可追踪性与维护性。
14. **反射和动态代理**:解释Java反射机制,如何在运行时获取类信息,以及动态代理的实现原理和应用。 15. **Java虚拟机(JVM)**:简述JVM的工作原理,类加载过程,以及如何通过JVM调优提升程序性能。 以上知识...
10. **反射和动态代理**:`java.lang.reflect`包提供了反射API,允许程序在运行时检查和操作类、接口、字段和方法。动态代理机制则允许在运行时创建实现一组指定接口的新类。 通过`jdk-6u10-api-en`这个压缩包,你...
4. **反射与动态代理**:Java的反射机制允许程序在运行时检查和操作类、接口、方法和字段。动态代理则允许创建代理类以实现运行时的拦截和增强。这两部分内容对于框架设计和元编程非常重要。 5. **枚举与注解**:...
14. **反射机制**:讲解如何在运行时动态获取类的信息,创建对象,调用方法,访问字段,以及动态代理。 15. **泛型**:介绍泛型的使用,如何定义泛型类、接口和方法,以及类型擦除的概念。 以上只是可能涵盖的一些...
10. **JNI与JVM**:简述JAVA本地接口(JNI)用于调用C/C++库,以及JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区等)和垃圾回收。 11. **设计模式**:结合JAVA语言,讲解常见的设计模式,如单例、工厂...
- 答案:反射允许在运行时动态获取类信息,创建和操作对象,实现动态代理,便于实现插件化或框架设计。 7. **设计模式** - 题目:举例说明单例模式的实现方式及其优缺点。 - 答案:单例模式确保一个类只有一个...
当有了一个WSDL文件,开发者可以利用工具如Apache Axis将WSDL解析并生成相应的Java客户端 stubs(代理类),这些代理类包含了调用Web服务所需的所有逻辑。 **Apache Axis的工作流程:** 1. **解析WSDL**:首先,...
14. **Java高级特性**:涵盖反射、注解、动态代理、模块化系统(Jigsaw)等Java的进阶特性。 课程资料“Programmation Orientée Objet en Java SMI S5 2020-2021.pdf”将详细讲解以上知识点,并通过实例解析和练习...
CORBA的基本概念和工作机制可以简述如下: **CORBA对象模型:** - **客户机(Client):** 发起请求的应用程序或对象,可以调用其他CORBA对象的服务。 - **对象请求代理(ORB):** 负责处理来自客户机的请求并将...
JNI的工作原理类似于代理模式,其中JVM充当了Java代码与本地代码之间的桥梁。具体步骤如下: 1. **定义本地方法**:在Java代码中,通过`native`关键字声明本地方法。 2. **生成JNI头文件**:使用`javah`工具根据...
13. **Java Applet与Servlet**:简述Java Applet在网络上的应用,以及Servlet在Web服务器端处理HTTP请求的基本原理。 随书光盘中可能包含的资源有源代码示例、练习题解答、配套课件等,这些资料有助于读者更好地...
#### 十二、简述Java内存模型? - **Java内存模型**: Java内存模型主要分为堆内存(Heap Memory)和栈内存(Stack Memory)。堆内存用于存储对象实例,而栈内存用于存储基本类型的变量和对象引用。 #### 十三、...
以上只是部分知识点的简述,Java面试题涉及广泛,包括但不限于并发编程、JVM内存管理、垃圾回收、Spring框架等,每个话题都值得深入探讨。在面试中,理解和掌握这些知识点将有助于回答各种技术问题。
12. **JAVA高级特性**:可能包括反射、注解、动态代理等进阶主题。 此外,序-目录-光盘内容及系统要求提供了关于教程的整体结构和学习资源的概述,本书内容简介则进一步阐述了教程的主要内容和目标读者。作者序-...
四、具体设计模式的简述 书中通过实例介绍了许多具体的设计模式,包括单例模式、工厂模式、抽象工厂模式等,并通过UML图示和示例代码对这些模式的内部结构和使用场景进行了详细解读。每一种模式都有其特定的使用背景...
11. **JVM**:简述Java虚拟机的工作原理,如类加载机制、内存模型(堆、栈、方法区等)、JVM优化等。 12. **泛型**:讲解泛型的引入、使用规则,以及其在集合、方法、接口中的应用。 13. **设计模式**:可能会涉及...