Java加载jar文件并调用jar文件当中有参数和返回值的方法
来源:互联网 发布:淘宝虚拟发布类目 编辑:程序博客网 时间:2024/05/01 01:31
在工作当中经常遇到反编译后的jar文件,并要传入参数了解其中的某些方法的输出,想到java里面的反射可以实现加载jar文件并调用其中的方法来达到自己的目的。就写了个Demo代码。
以下的类可以编译生成hello.jar文件。
package org.lele.fatpanda;public class Util{public static String myName;/* * 无参数,无返回值的方法。 */public static void getVersion(){System.out.println("java version: " + System.getProperty("java.version") );}/* *有参数,无返回值的方法。 */public static void setTmpName(String name){myName = name;System.out.println("Set Tmp Name Succeed and the name is : " + myName);}/* * 单个参数,有返回值的方法。 */public static String getName(String prefix){return prefix + "lele";}/* * 多个参数,有返回值的方法。 */public static String test(String i1, int i2){return i1 + i2;}}/* * 一个生成jar文件的类文件,要使用public的访问权限,如果在方便进行反射调用,则要将方法声明为static。 */
下面的就是实现动态加载并调用的主要代码。
package com.xiyoulele.wh;import java.io.File;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;public class Main{public static void main(String[] args){URL[] urls = new URL[] {};MyClassLoader classLoader = new MyClassLoader(urls, null); //自定义ClassLoader来加载jar文件try {classLoader.addJar(new File("c:\\hello.jar").toURI().toURL()); //加载特定路径的jar文件Class<?> clazz = classLoader.loadClass("org.lele.fatpanda.Util"); //动态加载jar文件当中的特定类的class文件//传入一个参数一个返回值Class<?>[] typeA = new Class[1]; //传入要调用的方法的参数类型typeA[0] = String.class;Object[] objsA = new Object[1]; //传入要调用的方法的具体参数objsA[0] = new String("xiyou");Method method = clazz.getDeclaredMethod("getName", typeA); //获取要被调用的特定方法 getName(String xx)String result = method.invoke(clazz, objsA).toString(); //调用方法,获取方法的返回值。System.out.println(result); //输出方法//传入2个参数一个人返回值Class<?>[] typesB = new Class[2];typesB[0] = String.class;typesB[1] = Integer.TYPE;Object[] ObjsB = new Object[2];ObjsB[0] = new String("ZT");ObjsB[1] = new Integer(520);Method newMethod = clazz.getDeclaredMethod("test", typesB);String res = newMethod.invoke(clazz, ObjsB).toString();System.out.println(res);//有传入的参数,没有返回值Class<?>[] typesC = new Class[1];typesC[0] = String.class;Object[] objsC = new Object[1];objsC[0] = new String("xiyoulele");Method methodC = clazz.getDeclaredMethod("setTmpName", typesC);methodC.invoke(clazz, objsC);//无参数,无返回值Method methodD = clazz.getDeclaredMethod("getVersion");methodD.invoke(clazz);classLoader.close(); //关闭类的加载器} catch (Exception e){e.printStackTrace();}}//继承URLClassLoader来实现对jar文件的加载static class MyClassLoader extends URLClassLoader{public MyClassLoader(URL[] urls){super(urls);}public MyClassLoader(URL[] urls, ClassLoader parent){super(urls, parent);}public void addJar(URL url){this.addURL(url);}}}/* * 需求:加载jar文件,动态调用里面的方法,该方法带有参数和返回值。 */程序运行的结果:
0 0
- Java加载jar文件并调用jar文件当中有参数和返回值的方法
- JAVA加载JAR包并调用JAR包中某个类的某个方法
- C#调用java的jar文件,jar文件转dll
- C#调用java的jar文件的方法(转)
- Java 动态加载jar和class文件
- Java动态加载jar文件
- Java调用外部jar文件
- android js调用java 并取得java当中的返回值返回到js的做法其实很简单,打包后出现问题记得修改proguard.cfg文件
- java 解析jar 文件,读取并进行调用
- JAVA实现动态加载jar包并调用其中的方法
- Java中动态加载jar文件和class文件
- Java中动态加载jar文件和class文件
- Java中动态加载jar文件和class文件
- java加载jar包和自定义class文件加载
- 【Java】Java项目导出Jar文件并运行方法
- java文件打成jar包的方法
- java动态加载jar包,并运行其中的类和方法 (jar是与平台无关的文件格式)
- 关于java文件导出jar文件的问题,区别开 jar file 和 runnable jar file
- Delphi6中使用TADOConnection和TADQuery组件连接访问数据库总结
- Contents & Index
- iOS开发-mutating method sent to immutable object错误
- 程序员面试精粹01
- Ubuntu 12.04下安装QT 4.0
- Java加载jar文件并调用jar文件当中有参数和返回值的方法
- 父类 xx = new 子类()与子类 xx = new 子类()的区别
- 蜗牛—cocos2dx学习之网址
- Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException.
- 华硕x53x不提示进入BIOS,安f2进入
- UIView的显示原理
- 深度优先搜索的用法——求数组部分和
- Linux下安装配置Nginx(Ubuntu)
- UIView+block动画和CALayer动画的区别