`
lianggl2008
  • 浏览: 25590 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

自定义类加载器,实现动态更新DEMO

阅读更多
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;

class CustomCL extends ClassLoader {

	private String basedir; // 需要该类加载器直接加载的类文件的基目录

	private HashSet dynaclazns; // 需要由该类加载器直接加载的类名

	public CustomCL(String basedir, String[] clazns) {

		super(null); // 指定父类加载器为 null

		this.basedir = basedir;

		dynaclazns = new HashSet();

		loadClassByMe(clazns);

	}

	private void loadClassByMe(String[] clazns) {

		for (int i = 0; i < clazns.length; i++) {

			loadDirectly(clazns[i]);

			dynaclazns.add(clazns[i]);

		}

	}

	private Class loadDirectly(String name) {

		Class cls = null;

		StringBuffer sb = new StringBuffer(basedir);

		String classname = name.replace('.', File.separatorChar) + ".class";

		sb.append(File.separator + classname);

		File classF = new File(sb.toString());

		try {
			cls = instantiateClass(name, new FileInputStream(classF),

			classF.length());
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return cls;

	}

	private Class instantiateClass(String name, InputStream fin, long len) {

		byte[] raw = new byte[(int) len];

		try {
			fin.read(raw);
			fin.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return defineClass(name, raw, 0, raw.length);

	}

	protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException {

		Class cls = null;

		cls = findLoadedClass(name);

		if (!this.dynaclazns.contains(name) && cls == null)

			cls = getSystemClassLoader().loadClass(name);

		if (cls == null)

			throw new ClassNotFoundException(name);

		if (resolve)

			resolveClass(cls);

		return cls;

	}

}

import java.lang.reflect.Method;
import java.util.TimerTask;

public class TimeTask extends TimerTask {
	// 在这里写你要定时执行的方法
	public void run() {
		//System.out.println("Hello World!");
		try {

			// 每次都创建出一个新的类加载器
			String baseDir = Test.class.getResource("/").getPath();
			
			/*System.out.println(ClassLoader.getSystemResource(""));        
			System.out.println(Test.class.getResource(""));        
			System.out.println(Test.class.getResource("/")); //Class文件所在路径 
			System.out.println(new File("/").getAbsolutePath());        
			System.out.println(System.getProperty("user.dir"));*/

			CustomCL cl = new CustomCL(baseDir, new String[] { "com.strongit.test.Foo" });

			Class cls = cl.loadClass("com.strongit.test.Foo");

			Object foo = cls.newInstance();

			Method m = foo.getClass().getMethod("sayHello", new Class[] {});

			m.invoke(foo, new Object[] {});

		} catch (Exception ex) {

			ex.printStackTrace();

		}
	}
}

public class Foo {

	/**
	 * @param args
	 */
	public void sayHello() {
		// TODO Auto-generated method stub
		System.out.println("hello world! (version one)");
	}

}
分享到:
评论

相关推荐

    自定义Java类加载器demo

    自定义Java类加载器demo,自定义了一个classLoader,重写了loadClass 和findClass,注意 loadClass打破了双亲委派机制,所有的类都要在自定义的class文件中找到,而findClass遵循了双亲委派机制

    C# winfrom 自定义表单设计器

    一个基于.NET C# 开发的 Winform 自定义表单设计组件。支持Xml保存和加载表单,支持控件的拖放和属设置,支持复制、粘贴、对齐、撤销、重做等设计时操作。

    vb.net 自定义控件(含自定义对话框设置属性) 实例

    vb.net 自定义控件 自定义属性 UITypeEditor UI 类型编辑器 实例 提供一个示例 UITypeEditor,它使用 IWindowsFormsEditorService 显示用于用户输入的 Form。 IWindowsFormsEditorService 只能通过 PropertyGrid ...

    Android 中LayoutInflater(布局加载器)之实战篇Demo

    Android 中LayoutInflater(布局加载器)之实战篇 博客的Demo 博客地址: http://blog.csdn.net/l540675759/article/details/78112989 两种方式实现小红书的引导页: (1)自定义View (2)自定义LayoutInflater....

    在React Native中使用自定义图标弹跳预加载器组件-JavaScript开发

    https://dribbble.com/shots/4423936-Islands-Preloader-Animation Demo htt使用自定义的React Native弹跳预加载器弹跳预加载器组件React Native中的图标基于Dany Rizky拍摄的运球:...

    应用启动页自定义跳转计时器View Demo

    应用启动页自定义跳转计时器View Demo: CircleTextProgressbar.java: package com.demo.startpageskiptimerdemo.widget; import android.content.Context; import android.content.res.ColorStateList; import ...

    ios开发控件之自定义选择器

    简单的自定义选择器demo,和两种加载选择数据源方式,内容经典不解释

    android开发demo集合

    简明、完整、全面的安卓开发demo集合,包含如下示例 1、LinearLayout Button、RadioGroup、 CheckBox 2、TableLayout 3、FrameLayout 霓虹灯效果 4、RelativeLayout 梅花效果 5、自定义view跟着触点走的小球 6、 ...

    ZLG_OBD_2_DEMO.rar

    其中包括其他项目特定的标头(包括 Resource.h),并声明 CZLG_UDS_DEMOApp 应用程序类。 ZLG_UDS_DEMO.cpp 这是包含应用程序类 CZLG_UDS_DEMOApp 的主应用程序源文件。 ZLG_UDS_DEMO.rc 这是程序使用的所有 ...

    ZLG_UDS_DEMO.rar

    其中包括其他项目特定的标头(包括 Resource.h),并声明 CZLG_UDS_DEMOApp 应用程序类。 ZLG_UDS_DEMO.cpp 这是包含应用程序类 CZLG_UDS_DEMOApp 的主应用程序源文件。 ZLG_UDS_DEMO.rc 这是程序使用的所有 ...

    ClassLoaderDemo.7z

    以一个实际的小例子,演示关于使用ClassLoader实现自定义多组件的加载Demo,可以帮助理解类加载器的双亲委托及破坏。

    JFinalDemo流程

    自动加载修改后的java文件,开发过程中无需重启web server AOP支持,拦截器配置灵活,功能强大 Plugin体系结构,扩展性强 多视图支持,支持FreeMarker、JSP、Velocity 强大的Validator后端校验功能 功能...

    ImagePicker-master.zip

    Android仿微信图片选择器Demo/具备剪裁/自定义图片加载器等功能

    Tensorflow分类器项目自定义数据读入的实现

    但是最终还是要训练自己的数据,所以尝试准备加载自定义的数据,然而demo中只是出现了fashion_mnist.load_data()并没有详细的读取过程,随后我又找了些资料,把读取的过程记录在这里。 首先提一下需要用到的模块: ...

    IKAnalyzer 中文分词 完整java项目demo

    IKAnalyzer非常易用的java分词工具。可以自定义扩展词汇。...这个是一个完整的java项目demo。直接可以用,不用再去google下载了。添加了几个自定义词汇,测试好用。 运行ika.java里的main方法即可

    fragment 懒加载和预加载的解决还包含自定义Tablayout+ViewPage指示器长度+获取本地相册图片并进行压缩的dmo+仿QQ控件底部加号弹框的

    fragment 懒加载和预加载的处理,有两个demo 都可以实现懒加在以及取消预加载

    【图片轮播】支持图片无限轮播,支持自定义指示点、显示提示文字、切换动画等

    支持根据服务端返回的数据动态设置广告条的总页数 支持大于等于1页时的无限循环自动轮播、手指按下暂停轮播、抬起手指开始轮播 支持自定义状态指示点位置 左 、中 、右 支持自定义状态指示点 支持监听 item 点击事件...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...

    苹果ios开发150个实例源码大全.zip

    苹果ios开发150个实例源码大全: ...加载器(当下载或加载缓存时候用的进度条) 可以左右滚动的tab bar 可以拖动图片,并可以进行图片旋转的demo 可以用于录音或其他方面的开始或播放动态圆形加载 可以用手指

Global site tag (gtag.js) - Google Analytics