`
chen422520
  • 浏览: 26397 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java 反射 加载指定目录下的Class文件

阅读更多

1    最近由于公司android 客服端的兄弟想做 动态扩展android应用,而不通过 重新发布版本来来实现,所以就考虑到用java的反射 加载指定的类

 

     A 一般加载类的  Class.froName的方法,这个方法是加载 已经集成或者导入到 项目下的jar 下面的类

 

          如是 找到Class类,发现只有 Class.forName的方法

 

     如是去找ClassLoader 发现 一个defineClass   的方法可以 接受字节数组,来生产Class对象,但是

 

  在编码工具中Eclipse 去实例这个类,在调用这个方法是,竟然发现竟然说这个方法不存在,开始我以为是文档的问题,

 

后面一想 ,java 中有许多方法是提供给jvm虚拟机用的,编码工具对其进行的过滤,后面同事收到一篇同样需求的代码,

 

 

一看才想明白,既然不能在外部调用,如果继承这个类,再重写这个方法,就可以实现这样的需求,额,有时候看样子还是

 

想的不够

 

好了,看实现类代码

public class ClassLoaderExpand extends ClassLoader {

	/**
	 * name class 类的文件名
	 */
	@Override
	protected Class<?> findClass(String name) throws ClassNotFoundException {
		byte[] datas = loadClassData(name);  
		return defineClass(name, datas, 0, datas.length);  
	}

	// 指定文件目录
	private String location;
	
	 public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}


	protected byte[] loadClassData(String name)  
	    {  
	    FileInputStream fis = null;  
	     byte[] datas = null;  
	    try  
	    {  
	       fis = new FileInputStream(location+name+".class");  
	       ByteArrayOutputStream bos = new ByteArrayOutputStream();  
	        int b;  
	        while( (b=fis.read())!=-1 )  
	         {  
	         bos.write(b);  
	         }  
	        datas = bos.toByteArray();  
	        bos.close();  
	     }catch(Exception e)  
	     {  
	         e.printStackTrace();  
	     }  
	     finally  
	     {  
	         if(fis != null)  
	        try  
	         {  
	             fis.close();  
	        } catch (IOException e)  
	         {  
	             e.printStackTrace();  
	         }  
	     }  
	     return datas;  
	
	  }  
}

 

再看调用方式

//实例扩展类
		ClassLoaderExpand clod=new ClassLoaderExpand();
		
		//指定java class 文件目录
		clod.setLocation("E:/service/");
		
		try {
			//调用 通过字节流生产java类
	    Class cl=clod.findClass("Test");
	    
	    //这里是调用带参数的方法,参数是数组对象
		Method method	=cl.getMethod("test2",new Class[]{String [].class});
		//如果这里 调用的是 实例方法 和以上的一样,只是后面调用Method的invoke不一样
		
		
		System.out.println(method.getName());
		
		
		method.invoke(cl, new Object[]{new String []{}});
//这里的cl 是 生产的类,为什么这里没有  cl.newInstance() ,因为调用的test2 是静态方法,如果不是静态方法,需要用一下的
//		method.invoke(cl.newInstance(), new Object[]{new String []{}});
		
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} 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();
		}

 

 

好了再看 Test 类中有哪些方法

public  void test1() {

		System.out.println("-----------1---------");
		
		
		System.out.println("asdfasdfasdfasd");
	}

	public static void test2(String[] args) {

		System.out.println("----------2----------");
		
		
		System.out.println("asdfasdfasdfasd");
	}

 

 

 

 

分享到:
评论
2 楼 chen422520 2012-06-25  
pengchang_2008 写道
您这个方法还是有用得,不过假如这个Test类不是默认包的,具有某个包名的话,需要怎么改动您的代码跑起来,我试了几种办法,就是不能调用一个含有包的代码,请指教!



你只需要加上包名 就好了 Class cl=clod.findClass("Test");  这里的Test直接是类名,你如果是带有包的,可以在这里加上
1 楼 pengchang_2008 2012-06-14  
您这个方法还是有用得,不过假如这个Test类不是默认包的,具有某个包名的话,需要怎么改动您的代码跑起来,我试了几种办法,就是不能调用一个含有包的代码,请指教!

相关推荐

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。...Java动态加载class; Java覆盖已加载的class; Java自定义classloader;

    JAVA反射机制详解视频

    (获取class文件对象的三种方式) (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并使用) (通过反射获取无参无返回值成员方法并使用) ...

    Java反射机制知识

    里面主要是介绍Java反射的只是,包括介绍Class类的初始化,如何通过反射动态加载类和获取类的信息等。

    java 反射

    这种动态获取信息以及动态调用对象方法的功能成为java反射机制。 2. java 文件和 .class 文件的关系 java 文件 java文件中包含代码的所有内容,类,接口,成员变量,成员方法.... .class 字节码文件 .class 是由 ...

    java习题-反射-chap15.pdf

    Chp15 反射Key Point ●Class 对象及其基本操作●Method 对象以及invoke 方法●标注练习 1. (类对象)要获得类对象,有三种不同的方式,分别为_____________________、___________________、_____________________...

    java反射机制原理详解.docx

    我们创建一个类,通过编译,生成对应的.calss文件,之后使用java.exe加载(jvm的类加载器)此.class文件,此.class文件加载到内存以后,就是一个运行时类,存在缓存区,那么这个运行时类的本身就是一个class的实例 ...

    Java高级程序设计实战教程第三章-Java反射机制.pptx

    应用程序通过读取配置文件来获取到指定名称的类的字节码文件并加载其中的内容进行调用,对一个类文件进行解剖,就可以取得任意一个已知名称的class的内部信息,包括其modifiers(诸如public,static等等)、...

    Java反射机制——类的加载方法,创建对象,获取方法以及结构

    一、java反射机制概述 Reflection (反射)被视为动态语言的关键,为什么这么说呢,是因为它在运行时就确定下来了。反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的...

    java 反射Reflection;Class类

    1.反射机制概述 java能够反射的前提:已经加载过这个类 反射可以通过类名来寻找这个类的所有相关信息、类似于人类的记忆,事先在记忆中有了这个事物的信息,人就可以通过名字来在记忆中寻找事物的具体...java反射机制的

    Java的反射机制深度解析

    ava语言允许通过程序化的方式间接的对Class操作,Class文件由类加载器加载后,在JVM中将形成一份描述Class的对象,通过该对象可以获知Class的结构信息,如构造函数,属性,方法等。并分别通过Java实例对这些信息进行...

    java反射原理详解

    JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:...

    java反射简单step

    java反射简单机制,可以参考,写的比较简单,通过Class静态类加载指定的类并得到其属性,构造方法和普通方法等。

    反射-类加载之间的关联关系

    1、 使用反射方法强制创建某各类或者接口对应的java.lang.Class对象时,会进行类加载,(而类加载会将字节码的class文件读入内存,并为之创建一个Class对象)。 2、 反射让类加载了,当然接着可以调用类的属性和方法...

    java反射机制介绍

    这个字的意思是“反射、映象、倒影”,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods...

    候捷谈Java反射机制

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...

    Java的反射机制讲解案例代码 Class类、 获取类的结构信息:构造函数、方法和字段,动态创建对象、调用方法和设置属性

    适用于有一定Java编程基础的开发人员,希望了解和应用Java反射机制的使用者。 使用场景及目标 使用反射机制的典型场景包括以下几个方面: 在运行时动态加载和创建类对象。 通过反射调用对象的方法和访问对象的字段...

    java反射机制

    JAVA反射机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:...

    Java基础 反射篇.md

    Java基础 反射篇 - Java基础 反射篇 - 反射的思想及作用 - 反射的基本使用 - 获取类的 Class 对象 - 构造类的实例化对象 - 获取一个类的所有信息 - 获取类中的变量(Field) - 获取类中的方法(Method) - ...

Global site tag (gtag.js) - Google Analytics