`
uule
  • 浏览: 6359011 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

java动态代理总结(狗星例子)

阅读更多

本文省略了异常

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
分享到:
评论

相关推荐

    Java动态代理helloworld

    总结来说,Java动态代理提供了一种在不修改原有代码的情况下,对已有类进行扩展的手段。它可以用于添加如日志、性能监控、事务处理等功能,极大地提高了代码的灵活性和可维护性。在实际开发中,如Spring AOP框架就...

    示例代码:java动态代理和cglib代理的简单例子

    总结,Java动态代理和CGLIB代理是Java中实现AOP的重要手段,它们通过代理模式提供了在不修改原始代码的情况下增强功能的能力。动态代理适合于处理实现了接口的目标类,而CGLIB则适用于任何类,无论其是否实现了接口...

    动态代理例子

    总结来说,动态代理是Java中一种强大的设计模式,它允许我们为现有对象添加新的行为,而无需修改原有代码。通过反射机制,我们可以在运行时创建并使用代理对象,使得代码更加灵活和可扩展。在实际开发中,动态代理常...

    java jdk 动态代理演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象能够拦截方法调用并在调用前后执行自定义的行为。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect....

    spring动态代理类的示范小版本,很简单的例子

    这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...

    动态代理文档和例子源码

    总结来说,这个压缩包提供的资源对于学习和理解Java动态代理非常有价值。通过阅读文档可以掌握理论知识,通过分析源码可以加深对实际操作的理解。对于想提升Java编程技能,特别是涉及AOP和RPC开发的开发者来说,这是...

    Java反射和动态代理实例

    几个Java反射和动态代理的小例子。可以学习如何通过Java的反射机制实例化对象、调用对象的方法、操作对象的私有成员变量、改变数组中的某项的值、改变数组大小等;可以学习Java的动态代理模式、学习Java工厂模式以及...

    使用java动态代理技术实现简单的AOP切面编程实例

    Java 动态代理技术是Java平台提供的一种强大的编程机制,它允许我们在运行时创建具有特定接口的代理对象,这些代理对象可以对方法调用进行拦截和处理,这正是AOP(面向切面编程)的核心思想。在Java中,动态代理主要...

    CGlib动态代理的好例子!

    CGlib,全称为Code Generation Library,是Java编程语言中的一个代码生成库,广泛应用于动态代理、性能监控以及AOP(面向切面编程)等领域。它是一个强大的、高性能的代码生成库,可以在运行期扩展Java类与实现Java...

    用Java动态代理实现AOP

    总结来说,Java动态代理是实现AOP的一种便捷方式,它允许我们在运行时创建代理类,以在不修改原有代码的基础上添加额外的行为。这对于日志、事务管理和错误处理等跨切面关注点的处理非常有用。通过将这些关注点从...

    2022年Java动态代理实现AOPJava教程.docx

    总结一下,Java动态代理在AOP中的应用主要有以下几个步骤: 1. 定义一个接口或使用已有接口,封装业务逻辑。 2. 创建业务对象实现该接口。 3. 实现`InvocationHandler`接口,定义在调用接口方法前后插入的额外行为。...

    静态代理和动态代理的例子

    下面是一个简单的静态代理例子: ```java // 接口 public interface Service { void doSomething(); } // 被代理类 public class RealService implements Service { @Override public void doSomething() { ...

    java之代理.pdf

    Java代理主要分为静态代理和动态代理。静态代理需要目标对象和代理对象都实现相同的接口,代理对象在编译时就已经确定,适用于简单场景。动态代理则更灵活,代理类和代理对象在运行时动态生成,不需要预先定义接口,...

    java实现免费代理IP的获取方式 并实时校验代理IP是否有效

    Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...

    静态代理和动态代理Demo

    总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...

    java中动态代理,springAop.pdf

    总结来说,Java动态代理提供了一种机制,可以在运行时创建具有额外功能的对象,而无需修改原有代码。Spring AOP利用这种机制来实现面向切面编程,将关注点分离,提高代码的可维护性和可复用性。在实际应用中,我们...

    java中的三种代理模式

    JDK动态代理基于Java反射API,可以在运行时动态地生成代理类和实例。它需要目标对象实现至少一个接口,然后通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来创建代理对象。...

    Java汉字转拼音课程设计例子总结

    这是在做Java课程设计时用到的例子,具体作者忘了是谁,是看了就能上手的例子。

    java 代理(动态、静态)实例

    总结,Java代理机制提供了一种灵活的方式来添加或扩展已有对象的功能,而无需修改其源代码。静态代理适用于已知接口和类的情况,而动态代理则更加灵活,尤其适用于处理多个具有相同接口的对象。通过理解这两种代理,...

    JAVA入门程序例子

    这个名为"JAVA入门程序例子"的压缩包提供了初学者学习Java语言的良好资源,涵盖了基础语法、J2SE常用包的运用、Java Swing图形界面设计以及JDBC数据库连接技术。 1. **JAVA语法基础**: - **变量与数据类型**:...

Global site tag (gtag.js) - Google Analytics