`
chen422520
  • 浏览: 27217 次
  • 性别: 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反射机制与动态加载实例类 在Java中,反射是一种强大的工具,允许程序在运行时检查和修改其结构和行为。通过反射,我们可以动态地加载类、创建对象、访问和修改字段、调用方法等。本文将深入探讨Java反射...

    反射,动态加载指定类调用类中的方法

    文件“loadClass--反射,动态加载指定类调用类中的方法.txt”可能包含了更具体的代码示例或关于这个主题的详细解释。通常,这种文本文件会提供额外的注释、错误处理或者特定情况下的用法说明。 需要注意的是,反射...

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

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

    JAVA反射机制-Class类-Class对象的获取.pdf

    ### JAVA反射机制——Class类与Class对象的获取 #### 概述 在Java语言中,反射是一种强大的功能,允许程序在运行时动态地检查和修改自身的行为。这种能力是通过`java.lang.Class`类实现的,它提供了封装类或接口...

    java反射 反编译:.class--&gt;.java

    Java反射机制是Java编程语言中一个非常重要的特性,它允许程序在运行时动态地获取类的信息并进行操作。反射机制的核心在于,它打破了程序在编译时的静态性,使得程序能够在运行时发现并调用类、接口、字段和方法等...

    Java 自动加载JAR文件并运行其中的类方法

    这个过程展示了如何利用Java的反射API和自定义类加载器实现JAR文件的动态加载和执行。在实际应用中,可能还需要考虑类的版本冲突、安全性和性能优化等问题。例如,使用服务发现框架(如OSGi)来管理类加载和依赖,...

    java 反射运行时加载外部jar到Tomcat StandardClassLoader1

    在上述描述中,我们看到一个具体的场景,即如何在 Tomcat 应用服务器中使用反射加载外部的 JAR 文件到 `StandardClassLoader`。 首先,了解 `StandardClassLoader` 的角色。在 Tomcat 中,`StandardClassLoader` 是...

    JAVA反射机制的入门代码

    总的来说,"JAVA反射机制的入门代码"是初学者理解Java反射机制的好教材,通过它,你可以学习如何动态地操作Java类,提高代码的灵活性,并掌握处理`properties`文件的基础方法。在深入学习和实践中,你将进一步理解...

    Java反射经典实例

    总结,Java反射机制提供了对运行时类信息的强大访问能力,虽然存在潜在的风险,但在许多场景下,如框架开发、动态代理、元编程等,它的优势是无可替代的。学习和熟练掌握Java反射,能够显著提升编程的灵活性和解决...

    java面试题--反射机制

    Java反射机制主要依赖于`java.lang.reflect`包下的API,其中包括: - `java.lang.Class`:表示一个类的运行时信息。 - `java.lang.reflect.Method`:表示类的方法。 - `java.lang.reflect.Field`:表示类的字段。 -...

    java反射.ppt

    - 动态加载和实例化类:在不预先知道类名的情况下,根据配置文件或用户输入动态加载和创建对象。 - 访问私有成员:通过反射可以绕过访问控制,访问私有字段和方法,但这通常应谨慎使用,因为可能破坏封装性。 - ...

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

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

    反射实例-JAVA反射机制

    Java反射机制在许多场景下都有广泛的应用: - **框架设计**:Spring框架利用反射机制实现依赖注入等功能。 - **单元测试**:JUnit等测试框架利用反射机制访问私有方法等。 - **热插拔式架构**:动态加载插件或模块...

    java 动态加载jar包

    Java反射API允许我们在运行时检查类、接口、字段和方法的信息,甚至可以创建和调用类的对象。通过Class类的forName()方法,我们能够根据类名加载类,即使该类在运行时并未被加载到JVM(Java虚拟机)中。例如: ```...

    Java反射机制总结

    - **运行时装配**:Java反射允许程序在运行时动态地加载类和创建对象,这对于构建可扩展的应用程序非常有用。 - **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**...

    JAVA反射机制详解视频

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

    Java反射性能测试分析

    本文将深入探讨Java反射的性能,并通过一系列测试分析来揭示其在不同场景下的表现。 #### Java反射基础 Java反射主要依赖于以下几类API: - `java.lang.Class`: 提供了获取类信息的方法。 - `java.lang.reflect....

    java反射源代码

    Java反射源于Java.lang.Class类,它代表了Java运行时的类信息。通过Class对象,我们可以获取到类的构造器、方法、字段等信息,甚至可以动态地实例化对象和调用其成员。例如,`Class&lt;?&gt; clazz = Class.forName(...

    JAVA 反射机制应用

    - 类加载:Java程序运行时,JVM会将.class文件加载到内存中,形成Class对象。 - 获取Class对象:通过Class.forName()、对象.getClass()或类名.class三种方式获取。 - 对象实例化:通过Class对象的newInstance()...

Global site tag (gtag.js) - Google Analytics