`

动态生成class

    博客分类:
  • java
 
阅读更多
ASM 进行动态生成class
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;

public class HelloWorld extends ClassLoader implements Opcodes{
	public static void main(String[] args) {
		ClassWriter cw = new ClassWriter(0);
		cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null);
		MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
		mw.visitVarInsn(ALOAD, 0);
		mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
		mw.visitInsn(RETURN);
		mw.visitMaxs(1, 1);
		mw.visitEnd();
		
		mw = cw.visitMethod(ACC_PUBLIC+ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null);
		mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
		mw.visitLdcInsn("Hello World!");
		mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
		mw.visitInsn(RETURN);
		mw.visitMaxs(2, 2);
		mw.visitEnd(); 
		
		byte[] code = cw.toByteArray();
		FileOutputStream fos;
		try {
			fos = new FileOutputStream("Example.class");
			fos.write(code);
			fos.close();
			
			HelloWorld loader = new HelloWorld();   
		     Class exampleClass = loader   
		         .defineClass("Example", code, 0, code.length);  
				exampleClass.getMethods()[0].invoke(null, new Object[] { null });
				
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException 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 (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}
}

 

cglib 动态生成class 并进行拦截

 

public class MyClass {
	public void print() {
		System.out.println("I'm in MyClass.print!");
	}
}


import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Main {

	public static void main(String[] args) {

		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(MyClass.class);
		enhancer.setCallback((Callback) new MethodInterceptorImpl());
		MyClass my = (MyClass) enhancer.create();
		my.print();
	}

	private static class MethodInterceptorImpl implements MethodInterceptor {

		public Object intercept(Object obj, Method method, Object[] args,
				MethodProxy proxy) throws Throwable {
			// log something
			System.out.println(method + " intercepted!");

			proxy.invokeSuper(obj, args);
			return null;
		}

	}
}
 
分享到:
评论
1 楼 sblig 2012-10-16  
输出: Hello World!

相关推荐

    asm动态生成class,并且动态加载执行

    NULL 博文链接:https://name327.iteye.com/blog/1554558

    ASM操作字节码,动态生成Java类class文件

    ASM是一个开源的Java字节码操控和分析框架,它能够用来动态生成类或者增强已有类的功能。ASM可以被用来创建Java代理、实现元编程、甚至深入到Java虚拟机(JVM)层面进行性能优化。在Java开发中,ASM库允许我们直接...

    动态编译字符串成java,并且添加class到jvm

    在Java编程中,动态编译字符串成Java代码并将其加载到JVM(Java虚拟机)是一种高级技巧,常用于运行时代码生成、元编程或插件系统等场景。这一技术的核心在于利用Java的反射API和Java Compiler API。下面将详细阐述...

    Java动态生成代码并编译载入.pdf

    Java动态生成代码并编译载入是一个高级的编程技术,主要用于那些需要在应用程序运行时根据某些模板和数据动态地生成、编译和加载Java代码的场景。这种技术在需要高度定制化处理或是运行时参数化生成业务逻辑的系统中...

    Xml文件自动生成C# Class类

    "Xml文件自动生成C# Class类"这个主题就涉及到了这一过程。这里我们将详细探讨如何实现这一功能,以及它在实际开发中的应用。 首先,XML文件是一种基于文本的数据存储格式,具有良好的可读性和结构化特性。它可以...

    读取Excle生成Class类代码

    标题中的“读取Excel生成Class类代码”是指利用C#编程语言,在Visual Studio 2017环境下,开发一个Winform应用程序,该程序能够读取Excel文件中的数据,并将其转换成C#类(Class)的代码形式。这个过程通常涉及以下...

    C#应用程序动态生成标签

    在C#编程中,动态生成标签是一项常见的任务,特别是在创建用户界面时,如果需要根据数据或其他条件自适应地创建控件,动态生成标签就显得尤为有用。本篇将深入探讨如何在C#窗体应用程序中实现这一功能。 一、基础...

    asp.net客户端动态生成控件

    在ASP.NET开发中,动态生成控件是一种常见的技术,它允许开发者在运行时根据需要创建、修改或删除页面上的用户界面元素。这种技术对于构建高度交互性和灵活性的应用程序尤其有用,比如在线表单、购物车或者任何需要...

    Java运行时动态生成类实现过程详解

    在Java中,通常情况下,class文件是在编译时生成的,但是有时候我们需要在运行时动态生成class。这可以通过两种方法来实现,一种是使用JDK自带的工具类,另一种是使用第三方库,例如CGLib和Javassist。 使用JDK自带...

    cglib动态生成java类

    CGLib的核心是ASM库,它能直接操作字节码,从而实现对类的动态生成和修改。 ### 动态代理的实现 1. **Enhancer**:CGLib中的核心类,用于创建代理对象。你可以通过`Enhancer`设置回调函数、目标对象、父类等,然后...

    c# 动态生成源代码并编译

    在C#编程中,动态生成源代码并进行编译是一项重要的技术,特别是在元编程、插件系统或自动化脚本编写等场景中。这项技术允许我们在程序运行时创建、修改和执行新的代码,增加了代码的灵活性和扩展性。下面将详细阐述...

    动态生成button以及点击事件

    实际上,动态生成UI组件可以扩展到更多复杂的场景,如根据数据源生成列表项,或者在用户交互后动态添加新的控件。理解并掌握这种技术对于Android开发者来说是非常重要的,因为它能够提供更高的灵活性和自定义性。 ...

    js动态生成tab页

    动态生成tab页是常见的功能需求,它允许用户在不同的内容面板之间切换,而无需页面刷新。本教程将深入探讨如何使用JS实现动态生成tab页,并结合HTML和CSS创建一个完整的框架界面。 首先,我们需要理解基本的HTML...

    android 动态加载class

    在Android开发中,动态加载Class是一项重要的技术,它允许应用程序在运行时加载未知或更新的类,从而提高软件的灵活性和可扩展性。这在处理插件化、热修复或者模块化开发时尤为常见。本篇文章将深入探讨如何在...

    tabcontrol动态生成选项卡,并添加窗体

    本篇将深入探讨如何在C#中动态地生成TabControl的选项卡,并在每个选项卡上添加独立的窗体。 首先,我们需要了解TabControl的基本使用。在Windows Forms应用程序中,可以通过设计视图或代码方式添加TabControl。...

    输出JDK和CGLib动态代理产生的class文件.zip

    本压缩包文件提供了两个示例项目,分别展示了JDK动态代理和CGLib动态代理的实现,帮助我们理解这两种技术的工作原理以及它们生成的class文件结构。 首先,我们来详细了解JDK动态代理。JDK动态代理基于Java的接口...

    动态生成、编译、运行java文件

    在IT行业中,动态生成、编译以及运行Java文件是一项重要的技术,它允许程序在运行时创建新的Java代码并执行。这种技术广泛应用于元编程、插件系统、代码自动生成等场景,极大地提高了软件的灵活性和可扩展性。下面将...

    新闻动态生成HTML,asp.net,功能强大,欢迎转载!

    新闻动态生成HTML是Web开发中的一个重要技术,它主要用于创建动态的、交互式的网站内容,以展示最新的资讯或更新。在ASP.NET框架下,这一过程变得更加高效和便捷。ASP.NET是微软公司推出的一种服务器端Web应用程序...

    通过Assmbly动态生成webservice

    当我们谈论“通过Assembly动态生成WebService”时,实际上是指利用.NET的反射、元数据以及IL(Intermediate Language)生成能力,实现在运行时动态创建和部署一个WebService服务。 一、WebService基础知识 ...

    动态生成与编译

    ### 动态生成与编译:深入理解.NET Framework中的CodeDOM机制 #### 一、引言 在.NET Framework中,动态生成与编译是一项非常重要的技术。这项技术的核心是CodeDOM(代码文档对象模型),它使得开发人员能够在运行时...

Global site tag (gtag.js) - Google Analytics