`
liyixing1
  • 浏览: 939598 次
  • 性别: 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反射机制与设计模式之一:代理模式的原理与应用;同时详细讲述了Java对代理模式的支持以及Java中动态代理的原理,应用与实践。

    JAVA反射机制和动态代理PDF

    简单易懂的例子,让你瞬间明白反射和代理的原理

    利用Java的反射与代理实现IOC模式

    Java的反射和动态代理机制,使Java变得更加强大。 Spring框架这几年风头正劲, 虽然使用者众多,但真正了解其内部实现原理的朋友却并不是很多。其实,了解它的内部实现机制和设计思想 是很有必要的大家都知道,...

    JAVA的反射机制与动态代理.pdf

    JAVA的反射机制与动态代理的工作原理和介绍

    Java反射机制的工作原理详解.docx

    这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的...

    JAVA反射机制与动态代理综合资料

    JAVA反射机制与动态代理综合里面自带了23个类的例子,用代码详细地解说了JAVA反射机制与动态代理原理,此资料对走java这条线的朋友有极大的帮助....

    JDK动态代理(AOP)使用及原理分析视频教程课件

    动态代理是使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。 而不用你创建类文件。不用写java文件。 动态:在程序执行时,调用jdk提供的方法才能创建代理类的对象。jdk动态代理,必须有接口,目标类必须...

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

    NULL 博文链接:https://arne3166.iteye.com/blog/1046340

    使用动态代理演示Spring的AOP编程原理

    为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...

    Java 动态代理 Demo

    Java Jdk 和 Cglib 动态代理 Demo 1.通过 JDK 反射形式创建动态代理 2.通过CGLIB基于ASM字节码...3.Java 反射原理演示 4.CGLib 依赖如下: &lt;groupId&gt;cglib &lt;artifactId&gt;cglib &lt;version&gt;3.3.0 &lt;/dependencies&gt;

    JAVA反身机制与动态代理(附源码).rar

    主要讲述Java反射机制与设计模式之一:代理模式的原理与应用同时详细讲述了Java对代理模式的支持以及Java中动态代理的原理,应用与实践 本课程要求大家对Java泛型知识有所了解,因为程序代码中大量使用了泛型相关...

    Java代理模式模板代码,包含动态代理与静态代理

    Java代理模式模板代码,包含动态代理与静态代理。 静态代理使用了传统的代理类来代理,动态代理中使用了jdk的反射原理进行代理

    JavaRpc:JAVA RPC实现,基于动态代理与反射

    RPC java实例 文章包括以下两个部分: RPC基本原理 RPC Java实例讲解 废话不多说,现在讲讲RPC到底是什么 RPC基本原理 RPC全程Remote Procedure Call Protocol,即远程过程调用协议,它是一种通过网络从远程计算机...

    Java动态代理

    本课程主要讲述Java反射机制与设计模式之一:代理模式的原理与应用 同时详细讲述了Java对代理模式的支持以及Java中动态代理的原理,应用与实践 本课程要求大家对Java泛型知识有所了解,因为程序代码中大量使用了泛型...

    JAVA动态配置中心DUCC源码

    为此提供一种解决方案,提高线上运行的...动态代理:通过动态代理调用反射生成对象的方法 1.1动态配置实现原理 线程异步+httpClient 线程异步:实例化对象并初始化,循环异步HttpClient调用获取配置,同步到自定义集合

    Java动态代理简单应用

    概念  代理模式是基本的设计模式之一,它是开发者为了提供额外的或...  Java动态代理实现机制采用了反射的思想,有关于反射的基础知识,可以参见博客Java发射机制浅析。  原理  Spring核心AOP实现技术之一是采用

    java 反射机制 详细讲解

    关于反射机制的原理什么的很详尽,经验总结精华奉献

    SpringAOP的实现机制(底层原理)、应用场景等详解,模拟过程的实例

    您将了解如何使用Java的反射机制来创建代理对象,以及如何将横切逻辑注入到目标方法中。我们还提供了实际示例,演示如何在Spring AOP中使用JDK动态代理。 CGLib动态代理: 我们将深入研究CGLib动态代理,它允许您在...

Global site tag (gtag.js) - Google Analytics