- 浏览: 961684 次
- 性别:
- 来自: 江西上饶
文章分类
- 全部博客 (460)
- p.spring (56)
- p.maven (20)
- p.ant (17)
- p.jee (18)
- p.jse (33)
- p.ofbiz (31)
- p.软件工程 (8)
- p.struts2 (5)
- p.hibernate (5)
- linux (25)
- 设计模式 (2)
- p.javascript (11)
- 硬件 (1)
- p.jsp (2)
- p.windows批处理 (1)
- 操作系统问题 (5)
- 算法 (1)
- p.mysql (7)
- p.sql (5)
- p.c (1)
- google产品 (0)
- 内存 (1)
- p.struts (1)
- p.freemarker (7)
- p.css (4)
- p.log4j (10)
- p.html (3)
- 淘宝产品 (0)
- 其他 (3)
- 编译器 (0)
- svn (4)
- p.spring.security (11)
- 图形 (0)
- p.xml (1)
- p.ssh (0)
- p.jquery (4)
- p.jdbc (3)
- p.flex (0)
- p.c++ (0)
- p.c#Net (0)
- p.assembly (0)
- p.sqlserver (0)
- p.其他 (3)
- p.webwork (21)
- p.wap (12)
- p.cglib (1)
- p.jee服务器 (11)
- windows (2)
- p.iphone (1)
- p.java.分布式与集群 (2)
- p.ibatis (16)
- p.eclipse (5)
- 架构 (2)
- http协议 (5)
- 我的个人标准 (2)
- 多线程 (1)
- 奇怪问题 (5)
- p.jira (13)
- p.httpclient (1)
- 服务器.apache (11)
- 安全防范 (1)
- p.PODAM (1)
- p.junit (16)
- fop (2)
- 硬盘安装 (1)
- powerdesigner (0)
- 单元测试 (1)
- apache commons (4)
- tomcat+apache集群 (10)
- 各类诡辩 (1)
- 安卓 (8)
- qvod (1)
- java编程基础知识考试考点及答案 (0)
- 工作总结 (4)
- oracle (0)
- spring的util工具 (3)
- json (2)
- maven (3)
- jms (19)
- p.bat (3)
- hadoop (2)
- git (3)
- nginx (1)
- p.移动开发 (1)
- shiro (3)
- 游戏破解 (1)
- react-native (7)
- ios开发 (1)
- webmagic (6)
- socks5 (1)
最新评论
-
weituotian:
说的不好,没人看的
公司系统中的菜单功能和权限功能 -
石不易:
非常详细的注解~
绑定端口和IP,Listen 与VirtualHost指令 -
spring_springmvc:
spring mvc demo教程源代码下载,地址:http: ...
spring mvc -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装 -
liyixing1:
PandaDONG 写道谢谢你啊,我已经下下来了,只是还有很多 ...
jira war安装
需要两个类,用于下面的测试
反射的例子,forName方法
// 根据classname来生成对象
根据方法名执行方法
代理,一个接口java.lang.reflect.InvocationHandler,和一个java.lang.reflect.Proxy类
Proxy用来生成生成一个代理类,InvocationHandler用于处理实际其他逻辑和调用被代理者,例子:
生成代理类已经代理类实例。
JAVA动态技术,原理,生成一个java文件,将这个生成的java文件加载内存
// 写入完毕,开始生成class文件(编译)
动态加载jar的方式类似
package test; public interface IProcess { public void process(); } package test; public class Process implements IProcess{ public void process() { System.out.println("实际处理器开始执行!"); } }
反射的例子,forName方法
// 根据classname来生成对象
@SuppressWarnings("unchecked") public static <U extends IProcess> U getObjectAsClassName(String className) { U proess = null; try { proess = (U) Class.forName(className).newInstance(); // proess.process(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return proess; }
根据方法名执行方法
public static void callMehod(String methodName, Process p) { Method[] methods = Process.class.getMethods(); for (Method method : methods) { if (method.getName().equals(methodName)) { // 找到方法,执行 try { method.invoke(p, new Object[] {}); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
代理,一个接口java.lang.reflect.InvocationHandler,和一个java.lang.reflect.Proxy类
Proxy用来生成生成一个代理类,InvocationHandler用于处理实际其他逻辑和调用被代理者,例子:
package test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 处理器代理,这个类实现了InvocationHandler * */ public class ProcessProxy implements InvocationHandler { private Object targs; public ProcessProxy(Object targs) { this.targs = targs; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("被代理对象执行前"); Object ret = method.invoke(targs, args); System.out.println("被代理对象执行后"); return ret; } }
生成代理类已经代理类实例。
@SuppressWarnings("unchecked") public static <U extends IProcess> U getProxyProcess(Object process) { ProcessProxy pp = new ProcessProxy(process); return (U) Proxy.newProxyInstance(Process.class.getClassLoader(), Process.class.getInterfaces(), pp); }
JAVA动态技术,原理,生成一个java文件,将这个生成的java文件加载内存
// 生成动态类 @SuppressWarnings("unchecked") public static IProcess makeDynamicClassObject(IProcess p) { String _package = "package test;\r\n"; String classDefine = "public class DynamicClass implements IProcess {" + "\r\n" + "private IProcess p;" + "public DynamicClass(IProcess p) {" + "this.p = p;" + "}" + "public void process() {" + "System.out.println(\"动态生成的java类,开始执行\");" + "p.process();" + "}" + "}"; String javaSourceCode = _package + classDefine; String fileName = System.getProperty("user.dir") + "/src/test/DynamicClass.java"; // 设置一个路径 File javaFile = new File(fileName); try { // 写入java文件 FileWriter outFile = new FileWriter(javaFile); outFile.write(javaSourceCode); outFile.flush(); outFile.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }
// 写入完毕,开始生成class文件(编译)
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileMang = compiler.getStandardFileManager( null, null, Charset.forName("utf-8")); Iterable<? extends JavaFileObject> units = fileMang .getJavaFileObjects(fileName); CompilationTask t = compiler.getTask(null, fileMang, null, null, null, units); t.call(); try { fileMang.close(); javaFile.delete(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { URLClassLoader uloader = new URLClassLoader(new URL[] { new URL( "file://" + System.getProperty("user.dir") + "/src/") }); try { //编译完成,加载 Class c = uloader.loadClass("test.DynamicClass"); //创建实例 return (IProcess) c.getConstructor(IProcess.class).newInstance( p); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
动态加载jar的方式类似
private static class JarLoader { private URLClassLoader urlClassLoader; public JarLoader(URLClassLoader urlClassLoader) { this.urlClassLoader = urlClassLoader; } public void loadJar(URL url) throws Exception { Method addURL = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); addURL.setAccessible(true); addURL.invoke(urlClassLoader, url); } } private static void loadjar(JarLoader jarLoader, String path) throws MalformedURLException, Exception{ File libdir = new File(path); if (libdir != null && libdir.isDirectory()) { File[] listFiles = libdir.listFiles(new FileFilter() { @Override public boolean accept(File file) { // TODO Auto-generated method stub return file.exists() && file.isFile() && file.getName().endsWith(".jar"); } }); for (File file : listFiles) { jarLoader.loadJar(file.toURI().toURL()); } }else{ System.out.println("[Console Message] Directory ["+path+"] does not exsit, please check it"); System.exit(0); } } public static void main(String[] args) { JarLoader jarLoader = new JarLoader((URLClassLoader)ClassLoader.getSystemClassLoader()); loadjar(jarLoader, System.getProperty("user.dir")+"/lib"); }
发表评论
-
java实现socks5
2019-07-16 23:05 1727socks5的基础知识 关于socks5的定义]https: ... -
java Runtime.exec方法详解
2019-07-11 14:11 21561.关于CMD(为了让exec ... -
Spring 定时任务,cron表达式,@Scheduled cron表达式
2016-04-25 15:48 5303一个cron表达式有至少6 ... -
xulrunner
2016-01-13 13:07 669http://ftp.mozilla.org/pub/xulr ... -
谈一谈自己对依赖、关联、聚合和组合之间区别的理解
2015-11-17 16:05 780在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系 ... -
java apache common unicode处理
2015-09-19 15:17 1567if (UnicodeConvertType.中文转unico ... -
jdbc ssh通道
2015-09-17 14:40 1866java通过ssh链接数据库,需要用到 JSCH是一个纯粹的用 ... -
swt 窗口 最大化最小化按钮设置等
2015-09-14 17:53 4330窗体顶部菜可以在实例化的时候设置,也可以单独设置:Shell ... -
java.lang.Process调用程序阻塞问题解决
2015-08-14 10:56 4264这两天一直在处理flv视频环境的搭建工作,包括服务器的安 ... -
java html解析
2015-07-31 17:31 1213dom解析是常用dom4j。 android中我们常用的是sa ... -
slf4j门面模式实现原理
2015-07-16 10:08 2987在使用slf4j的时候,只 ... -
java - 比较时间-相差月数
2015-06-15 09:57 1471Date经常会出现比较两个Date相差的月数,实际上可以做一个 ... -
log4jdbc
2014-12-25 13:55 3054该框架目前支持到jdbc3.和jdbc4的版本。 提供了多种 ... -
jdbc规范 jdbc1 jdbc2 jdbc3 jdbc4
2014-12-25 13:49 5076目前jdbc规范已经升级到 ... -
Bean Validation 1.0(JSR-303)
2014-11-18 16:15 1097http://jinnianshilongnian.iteye ... -
JRE最小化原理
2014-10-15 20:19 1309比如我们一个程序只用到了很少的类,像String,Intege ... -
时间重叠的判断
2014-02-14 11:16 1652如上图,粗线是时间1 细线是时间2 时间重叠,只可能是以上四 ... -
java获取当前类的绝对路径
2013-12-14 00:37 9001.如何获得当前文件路径 常用: (1).Test.class ... -
枚举 enum
2013-12-13 16:52 5235java的enum其实是一个类。编译器根据你enum的定义会为 ... -
EL表达式,ognl表达式对集合过滤和投影
2013-11-23 11:48 1212GONL<s:property value=" ...
相关推荐
java反射机制和动态代理的原理,熟悉反射机制和动态代理
Java动态代理和反射是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将通过实例演示这两种技术,并详细解释它们的工作原理。 首先,我们来了解一下Java动态代理。动态代理主要...
Java反射机制是Java语言的一种强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及...
Java反射和动态代理是Java编程中的重要特性,它们允许程序在运行时检查和操作类、接口、对象等的内部结构,以及动态地创建代理对象来处理特定任务。在这篇文章中,我们将深入探讨这两个主题,结合"reflections"这个...
在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的能力,这使得动态代理的实现成为可能。在Java中,可以使用java.lang.reflect包下的相关类和接口实现动态代理。 例如,通过...
主要讲述Java反射机制与设计模式之一:代理模式的原理与应用;同时详细讲述了Java对代理模式的支持以及Java中动态代理的原理,应用与实践。
Java反射的另一个重要应用是动态代理。动态代理可以在运行时创建一个实现一组给定接口的新类,这个新类可以对方法调用进行拦截并在调用前后执行自定义逻辑。这在AOP(面向切面编程)中非常有用,例如日志记录、性能...
Java动态代理是基于Java反射机制的一种实现方式,它允许我们在运行时动态地创建一个实现了某些接口的新类。Java动态代理主要用于创建代理对象,这些代理对象可以实现在特定时刻的行为增强。 **1. Java动态代理类的...
要实现自定义拦截器Interceptor,首先我们需要了解反射机制和动态代理的工作原理。反射机制是指在Java程序中,可以在运行时动态地获取和修改类的结构和行为,而不是在编译时确定的。动态代理是指在运行时动态地生成...
1. 动态代理原理:动态代理是基于Java反射机制,通过在运行时动态生成实现了特定接口的代理类,以此来实现对原对象的代理。 2. java.lang.reflect.Proxy类:Proxy类提供了创建动态代理类和代理对象的工厂方法。通过...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
- **动态代理**:Java的`java.lang.reflect.Proxy`类可以创建动态代理对象,实现接口的动态方法调用。 然而,反射也存在一些潜在的问题,如性能损耗、安全性风险(可访问私有成员)以及易用性降低(编译器无法提供...
Java反射和分发是Java编程中的高级特性,它们在许多实际场景中发挥着重要作用,比如框架设计、插件系统、动态代理等。本教程将深入探讨这两个概念,并通过实例代码来帮助理解其工作原理。 首先,让我们理解Java反射...
#### 四、Java动态代理原理 Java动态代理是在运行时动态创建代理对象的过程,主要用于实现AOP(面向切面编程)等场景。Java提供了两种实现动态代理的方式: 1. **基于接口的动态代理**:利用`java.lang.reflect....
### Java反射机制与动态代理详解 #### 一、Java反射机制概述 Java反射机制是一种强大的工具,能够在程序运行时获取类的信息(如类名、字段、方法等)并操作它们。这种能力使得Java具备了一定程度上的动态性,极大...
总结,Java反射机制是Java平台灵活性和动态性的体现,它极大地扩展了Java程序的能力,但同时也需要谨慎使用,平衡好其带来的便利和潜在问题。学习和理解反射机制对于深入理解Java以及开发复杂系统至关重要。
同时,我们也探讨了动态代理机制的工作原理及其在实际开发中的应用场景。这些技术都是Java开发者必须掌握的关键技能之一,能够极大地提高代码的灵活性和可维护性。希望通过对这些概念和技术的深入理解,能够帮助你在...
Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...