- 浏览: 6351814 次
- 性别:
- 来自: 一片神奇的土地
文章分类
- 全部博客 (745)
- JQuery (25)
- JS (33)
- 数据库 (59)
- Java基础 (56)
- JSON (8)
- XML (8)
- ireport (7)
- 设计模式 (10)
- 心情 (14)
- freemarker (1)
- 问题 (15)
- powerdesigner (2)
- CSS (15)
- DWR (4)
- tomcat (16)
- Hibernate (12)
- Oracle (7)
- Struts (7)
- Spring (34)
- JSP (23)
- 需学习 (64)
- 工具类库 (63)
- Maven (14)
- 笔试题 (34)
- 源码学习 (31)
- 多线程 (39)
- Android (32)
- 缓存 (20)
- SpringMVC (14)
- jQueryEasyUi (12)
- webservice-RPC (13)
- ant (1)
- ASP.NET (10)
- 正则表达式 (3)
- Linux (15)
- JBoss (1)
- EJB (3)
- UML (2)
- JMS (3)
- Flex (8)
- JSTL (2)
- 批处理 (5)
- JVM (16)
- 【工具】 (16)
- 数据结构 (29)
- HTTP/TCP/Socket (18)
- 微信 (1)
- tomcat源码学习 (15)
- Python (30)
- 主机 (2)
- 设计与架构 (19)
- thrift-RPC (2)
- nginx (6)
- 微信小程序 (0)
- 分布式+集群 (12)
- IO (1)
- 消息队列 (4)
- 存储过程 (8)
- redis (9)
- zookeeper (5)
- 海量数据 (5)
最新评论
-
360pluse:
技术更新,战术升级!Python爬虫案例实战从零开始一站通网盘 ...
Python爬虫实战:Scrapy豆瓣电影爬取 -
18335864773:
推荐用 pageoffice 组件生成 word 文件。
JAVA生成WORD工具类 -
jjhe369:
LISTD_ONE 写道起始地址为163.135.0.1 结束 ...
IP地址与CIDR -
baojunhu99:
private final int POOL_SIZE = 5 ...
使用CompletionService获取多线程返回值 -
LovingBaby:
胡说,javascript 运行时是单线程的,event lo ...
Ajax请求是否可以实现同步
本文省略了异常
1.生成对象:
Process process = getObjectAsClassName("test.Process");
// 根据classname来生成对象 public static <U extends IProcess> U getObjectAsClassName(String className) { U proess = null; proess = (U) Class.forName(className).newInstance(); return proess; }
2、通过方法名执行方法:
Process process = getObjectAsClassName("test.Process");
callMehod("process", process);
// 根据method方法名执行方法 public static void callMehod(String methodName, Process p) { Method[] methods = Process.class.getMethods(); //Method[] methods = Class.forName("com.Process").getMethods(); for (Method method : methods) { if (method.getName().equals(methodName)) { // 找到方法,执行 method.invoke(p, new Object[] {}); } }
method.invoke():
第一个参数是对象,第二个参数是参数列表
3、基于接口的JDK动态代理:
IProcess processxy = getProxyProcess(process);
processxy.process();
//创建代理对象 @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); }
Proxy.newProxyInstance:
第一个参数是代理类的ClassLoader ,第二个参数是Interfaces,第三个是InvocationHandler对象
ProcessProxy.java:
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; } }
4、动态生成java文件并编译为class文件执行
// 生成动态类 //运行时动态生成文本的.java文件,调用java编译工具类编译成.class二进制文件,就像web服务器将jsp编译成servlet一样 @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;\r\n" + "public DynamicClass(IProcess p) {\r\n" + "this.p = p;" + "}\r\n" + "public void process() {\r\n" + "System.out.println(\"动态生成的java类,开始执行\");" + "p.process();\r\n" + "}" + "}"; String javaSourceCode = _package + classDefine; System.out.println("System.getProperty('user.dir'):"+System.getProperty("user.dir")); //获取项目的根路径 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) { e.printStackTrace(); } // 生成class文件 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); //此处需要使用JDK包,而非jre包,因为jre包中无编译器 StandardJavaFileManager fileMang = compiler.getStandardFileManager( null, null, Charset.forName("utf-8")); Iterable units = fileMang .getJavaFileObjects(fileName); CompilationTask t = compiler.getTask(null, fileMang, null, null, null, units); t.call(); fileMang.close(); javaFile.delete(); //执行class文件 URL url = new URL("file://" + System.getProperty("user.dir") + "/src/"); URLClassLoader uloader = new URLClassLoader(new URL[] { url }); Class c = uloader.loadClass("test.DynamicClass"); return (IProcess) c.getConstructor(IProcess.class).newInstance(p); return null; }
问题1:JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();出现空指针异常的问题
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();可以获得环境下边的编译器的引用,但为什么我们在debug到这一语句的时候,查看到此函数返回的是一个null值,即没有编译器。。。。
我们知道,jre是java runtime environment,我们在运行java程序的时候其实就是调用jre里面的java.exe或者javaw.exe,我们安装jdk1.6的时候,会在安装包java下发现jdk1.6和jre1.6两个文件夹,在jdk1.6下有 一个jre包,包里的内容和jre1.6文件夹下的内容是一样的。这是因为我们在开发程序的时候需要用到jre,所以jdk1.6.0_07下 有一个jre包,但只运行java程序的时候,只会用到jre1.6.0_07下的命令。
弄清楚这一点,问题就好说了,我们要获得编译器,可是jre1.6.0_07文件夹下根本没有编译器,所有我们应该使用jdk1.6.0_07文件 夹下的jre,在windows=》pereference=》java=>installl jre里面,添加jdk1.6中的jre,并勾选它。这样空指针异常就解决了。。。。
为什么我们用命令行执行相同的程序不会出现那个空指针异常呢,那是因为我们在寻找jre的时候是在优先考虑jdk下的jre的,但eclipse下是指定了jre的,所有我们在命令行下不会出错。。
- test.rar (4.6 KB)
- 描述: 狗星例子所以java文件
- 下载次数: 13
发表评论
-
拦截器和过滤器的区别
2019-06-27 10:46 7060【Spring的拦截器】于【Servlet的Filter】有 ... -
高并发下的数据结构List/Set/Map
2019-03-26 14:17 1268高并发下的Java数据结 ... -
tomcat的三种运行模式+JAVA NIO
2019-03-12 11:13 5085详解Tomcat三种运行模 ... -
反射基础
2019-01-11 14:51 663十年架构师不到400行手写一个Spring MVC ... -
java反射原理, 注解原理
2019-01-08 17:22 4584注解机制及原理 JAVA ... -
内存泄露与内存溢出的区别
2018-12-24 16:14 27461、内存泄漏 memory le ... -
深入解析JAVA中的装箱与拆箱
2018-12-21 10:42 1318地址: https://www.cnblogs.com/d ... -
负载均衡原理
2018-12-20 17:43 799简介几种负载均衡原理 高并发解决方案之一 ——负载均衡 ... -
CAS自旋锁
2018-12-20 11:12 1645我们常说的 CAS 自旋锁是什么 CAS与ABA问题 ... -
编码问题+字节+unicode
2017-11-28 10:52 4307ASCII -》 ISO8859-1 -》GB2312 - ... -
Java基础知识总结(二)~持续学习中
2017-10-11 17:56 161130.try-catch public class T ... -
StringTokenizer-大数据情况下截取字符串
2016-11-23 11:00 3171java.util.StringTokenizer ... -
tomcat中处理消息提示的公用类 StringManager.java
2016-11-18 10:24 1836代码很简单,主要学习思路。 tomcat中处理消息 ... -
JAVA IO流中的flush
2016-11-18 09:51 3240前言: 大家在使用Java IO流中Output ... -
读取JAR中文件
2015-12-08 17:03 3802【解惑】深入jar包:从jar包中读取资源文件 读取ja ... -
JAVA过滤敏感词
2015-12-07 17:38 3305Java实现敏感词过滤 编程珠玑 - 算法优化 - 过 ... -
java过滤特殊字符串
2015-08-25 19:32 14686// 过滤特殊字符 public stat ... -
java.lang.reflect.Array.newInstance与list.toArray
2015-08-18 16:35 3895一. import java.util. ... -
JRE下的rt.jar、tools.jar
2014-10-29 10:59 13460JRE下的rt.jar: 这个文件是极为重要的一个文件,r ... -
内部类
2014-10-21 17:58 1290定义: 内部类 就是在类的内部嵌套定义一个类 使用内部类 ...
相关推荐
总结来说,Java动态代理提供了一种在不修改原有代码的情况下,对已有类进行扩展的手段。它可以用于添加如日志、性能监控、事务处理等功能,极大地提高了代码的灵活性和可维护性。在实际开发中,如Spring AOP框架就...
总结,Java动态代理和CGLIB代理是Java中实现AOP的重要手段,它们通过代理模式提供了在不修改原始代码的情况下增强功能的能力。动态代理适合于处理实现了接口的目标类,而CGLIB则适用于任何类,无论其是否实现了接口...
下面通过一个简单的例子来理解Java动态代理的工作原理: ```java // 定义接口 public interface HelloWorld { void sayHelloWorld(); } // 实现接口 public class HelloWorldImpl implements HelloWorld { ...
总结来说,动态代理是Java中一种强大的设计模式,它允许我们为现有对象添加新的行为,而无需修改原有代码。通过反射机制,我们可以在运行时创建并使用代理对象,使得代码更加灵活和可扩展。在实际开发中,动态代理常...
Java动态代理是Java语言提供的一种高级特性,它允许我们在运行时创建一个代理对象来代替某个接口或类的对象,这个代理对象能够对方法调用进行拦截和处理。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`...
java动态代理项目实践优化(3)
在Java中,我们可以使用两种主要的方式来实现动态代理:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: - JDK动态代理基于接口实现,它要求被代理的目标对象必须实现至少一个接口。代理类会在运行时动态创建...
这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...
总结来说,这个压缩包提供的资源对于学习和理解Java动态代理非常有价值。通过阅读文档可以掌握理论知识,通过分析源码可以加深对实际操作的理解。对于想提升Java编程技能,特别是涉及AOP和RPC开发的开发者来说,这是...
几个Java反射和动态代理的小例子。可以学习如何通过Java的反射机制实例化对象、调用对象的方法、操作对象的私有成员变量、改变数组中的某项的值、改变数组大小等;可以学习Java的动态代理模式、学习Java工厂模式以及...
Java 动态代理技术是Java平台提供的一种强大的编程机制,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以对方法调用进行拦截和处理,这正是AOP(面向切面编程)的核心思想。在Java中,动态代理主要...
java 动态代理的前世今生 dynamic proxy in java
CGlib,全称为Code Generation Library,是Java编程语言中的一个代码生成库,广泛应用于动态代理、性能监控以及AOP(面向切面编程)等领域。它是一个强大的、高性能的代码生成库,可以在运行期扩展Java类与实现Java...
总结来说,Java动态代理是实现AOP的一种便捷方式,它允许我们在运行时创建代理类,以在不修改原有代码的基础上添加额外的行为。这对于日志、事务管理和错误处理等跨切面关注点的处理非常有用。通过将这些关注点从...
总结一下,Java动态代理在AOP中的应用主要有以下几个步骤: 1. 定义一个接口或使用已有接口,封装业务逻辑。 2. 创建业务对象实现该接口。 3. 实现`InvocationHandler`接口,定义在调用接口方法前后插入的额外行为。...
下面是一个简单的静态代理例子: ```java // 接口 public interface Service { void doSomething(); } // 被代理类 public class RealService implements Service { @Override public void doSomething() { ...
总结起来,动态代理和Spring AOP是Java和Spring框架中的核心特性,它们有助于提升代码的可维护性和可扩展性。通过对`Proxy`类、`InvocationHandler`接口以及Spring AOP的切点和通知的理解,我们可以更有效地编写和...
Java代理主要分为静态代理和动态代理。静态代理需要目标对象和代理对象都实现相同的接口,代理对象在编译时就已经确定,适用于简单场景。动态代理则更灵活,代理类和代理对象在运行时动态生成,不需要预先定义接口,...
Java注解、反射、动态代理demo
总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...