`
liyixing1
  • 浏览: 961684 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

反射,代理,动态java原理

阅读更多
需要两个类,用于下面的测试

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反射机制和动态代理的原理

    java反射机制和动态代理的原理,熟悉反射机制和动态代理

    Java动态代理和Java反射的Demo演示

    Java动态代理和反射是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将通过实例演示这两种技术,并详细解释它们的工作原理。 首先,我们来了解一下Java动态代理。动态代理主要...

    java反射原理详解

    Java反射机制是Java语言的一种强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射主要涉及到`java.lang.Class`类、`java.lang.reflect`包中的类(如Constructor、Method、Field)以及...

    经典java反射和动态代理代码

    Java反射和动态代理是Java编程中的重要特性,它们允许程序在运行时检查和操作类、接口、对象等的内部结构,以及动态地创建代理对象来处理特定任务。在这篇文章中,我们将深入探讨这两个主题,结合"reflections"这个...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在Java开发中,反射机制是实现动态代理的关键技术之一。反射提供了在运行时访问和操作类的能力,这使得动态代理的实现成为可能。在Java中,可以使用java.lang.reflect包下的相关类和接口实现动态代理。 例如,通过...

    Java反射机制和动态代理

    主要讲述Java反射机制与设计模式之一:代理模式的原理与应用;同时详细讲述了Java对代理模式的支持以及Java中动态代理的原理,应用与实践。

    java反射的原理机制

    Java反射的另一个重要应用是动态代理。动态代理可以在运行时创建一个实现一组给定接口的新类,这个新类可以对方法调用进行拦截并在调用前后执行自定义逻辑。这在AOP(面向切面编程)中非常有用,例如日志记录、性能...

    Java代理模式Java动态代理

    Java动态代理是基于Java反射机制的一种实现方式,它允许我们在运行时动态地创建一个实现了某些接口的新类。Java动态代理主要用于创建代理对象,这些代理对象可以实现在特定时刻的行为增强。 **1. Java动态代理类的...

    利用反射和动态代理机制实现自定义拦截器Interceptor

    要实现自定义拦截器Interceptor,首先我们需要了解反射机制和动态代理的工作原理。反射机制是指在Java程序中,可以在运行时动态地获取和修改类的结构和行为,而不是在编译时确定的。动态代理是指在运行时动态地生成...

    JAVA反射机制与动态代理

    1. 动态代理原理:动态代理是基于Java反射机制,通过在运行时动态生成实现了特定接口的代理类,以此来实现对原对象的代理。 2. java.lang.reflect.Proxy类:Proxy类提供了创建动态代理类和代理对象的工厂方法。通过...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...

    java反射机制原理

    - **动态代理**:Java的`java.lang.reflect.Proxy`类可以创建动态代理对象,实现接口的动态方法调用。 然而,反射也存在一些潜在的问题,如性能损耗、安全性风险(可访问私有成员)以及易用性降低(编译器无法提供...

    java 反射和分发器原理

    Java反射和分发是Java编程中的高级特性,它们在许多实际场景中发挥着重要作用,比如框架设计、插件系统、动态代理等。本教程将深入探讨这两个概念,并通过实例代码来帮助理解其工作原理。 首先,让我们理解Java反射...

    java 动态代理 完整版

    #### 四、Java动态代理原理 Java动态代理是在运行时动态创建代理对象的过程,主要用于实现AOP(面向切面编程)等场景。Java提供了两种实现动态代理的方式: 1. **基于接口的动态代理**:利用`java.lang.reflect....

    java反射机制与动态代理

    ### Java反射机制与动态代理详解 #### 一、Java反射机制概述 Java反射机制是一种强大的工具,能够在程序运行时获取类的信息(如类名、字段、方法等)并操作它们。这种能力使得Java具备了一定程度上的动态性,极大...

    java反射机制原理和反射机制总结

    总结,Java反射机制是Java平台灵活性和动态性的体现,它极大地扩展了Java程序的能力,但同时也需要谨慎使用,平衡好其带来的便利和潜在问题。学习和理解反射机制对于深入理解Java以及开发复杂系统至关重要。

    java反射及动态代理

    同时,我们也探讨了动态代理机制的工作原理及其在实际开发中的应用场景。这些技术都是Java开发者必须掌握的关键技能之一,能够极大地提高代码的灵活性和可维护性。希望通过对这些概念和技术的深入理解,能够帮助你在...

    java动态代理机制分析及拓展

    Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...

Global site tag (gtag.js) - Google Analytics