Java加载jar文件并调用jar文件当中有参数和返回值的方法
在工作当中经常遇到反编译后的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.getMethod("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.getMethod("test", typesB);
String res = newMethod.invoke(clazz.newInstance(), 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.getMethod("setTmpName", typesC);
methodC.invoke(clazz.newInstance(), objsC); //无参数,无返回值
Method methodD = clazz.getDeclaredMethod("getVersion");
methodD.invoke(clazz.newInstance()); 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文件,动态调用里面的方法,该方法带有参数和返回值。
*/
程序运行的结果:

Java加载jar文件并调用jar文件当中有参数和返回值的方法的更多相关文章
- 058、Java中定义一个没有参数没有返回值的方法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- JS中函数的本质,定义、调用,以及函数的参数和返回值
要用面向对象的方式去编程,而不要用面向过程的方式去编程 对象是各种类型的数据的集合,可以是数字.字符串.数组.函数.对象…… 对象中的内容以键值对方式进行存储 对象要赋值给一个变量 var cat={ ...
- c++ ado 调用存储过程并得到输出参数和返回值
// AccessSqlserverByAdo.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h ...
- 059、Java中定义一个有参数无返回值的方法
01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...
- Java加载资源文件的两种方法
处理配置文件对于Java程序员来说再常见不过了,不管是Servlet,Spring,抑或是Structs,都需要与配置文件打交道.Java将配置文件当作一种资源(resource)来处理,并且提供了两 ...
- 解决maven无法加载本地lib/下的jar包问题(程序包XXX不存在)
这次一个项目用到maven编译,我在本地开发的时候jar包都是放在WEB-INF/lib目录下,通过 BuildPath将jar包导入,然后用MyEclipse中的:maven package命令打成 ...
- 【转】解决maven无法加载本地lib/下的jar包问题(程序包XXX不存在)
原文链接:https://www.cnblogs.com/adeng/p/7096484.html 这次一个项目用到maven编译,我在本地开发的时候jar包都是放在WEB-INF/lib目录下,通过 ...
- java加载properties文件的六中基本方式实现
java加载properties文件的方式主要分为两大类:一种是通过import java.util.Properties类中的load(InputStream in)方法加载: 另一种是通过impo ...
- JAVA加载Properties配置资源文件
JAVA加载Properties配置资源文件 制作人:全心全意 配置文件(资源文件):以properties作为拓展名的文件 Java代码是如何加载properties文件的? 必须使用Propert ...
随机推荐
- 请求库之requests
一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:requests库发送请求将网页内 ...
- 官方微信接口(全接口) - 微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI
微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.微信支付.微信红包.微信卡券.微信小店. 微信开发探讨群 330393916 <?php /** * Description o ...
- 杭电1022Train Problem I
地址:http://acm.hdu.edu.cn/showproblem.php?pid=1022 题目: Problem Description As the new term comes, the ...
- Calendar的那些神坑
参考我的博客:http://www.isedwardtang.com/2017/08/31/java-calendar-bug/
- 哆啦A梦里的某一首诗
<哆啦A梦>长篇<宇宙开拓>主题曲<放松心情>作词:武田铁矢 我终于发现, /昨日失去的一切, /虽然还无法完全意会, /可是对我却非常重要. /加紧脚步追赶, / ...
- 2018-2019-2 20165114《网络对抗技术》Exp2 后门原理与实践
目录 一.实验准备 二.实验内容 三.基础问题回答 四.实验过程及步骤 五.实验总结与体会 六.实验中遇到的问题与错误. 一.实验准备 1.后门概念 后门就是不经过正常认证流程而访问系统的通道. 哪里 ...
- 配置nginx,Tomcat日志记录请求耗时
由于公司的业务比较特殊,对速度比较在意,客户最近反应我们的平台时间比较久,处理一个请求十秒左右才返回,领导要求找出原因,我想让nginx日志记录请求处理用了多长时间,后端处理用了多长时间,总共用了多长 ...
- Python 类的三大特性的综合运用 案例
# --------------------- 类的三大特性的综合运用 案例 ------------------------- # 定义三个类:小狗,小猫,人 # 小狗:姓名,年龄(默认1岁) 吃饭 ...
- Python中求阶乘(factorial)
1. math.factorial(x) import math value = math.factorial(x) 2. reduce函数 def factorial(n): return redu ...
- Makefile文件应用——complicated项目
学习资料 本文主要参考资料:驾驭Makefile(李云).pdf Complicated项目 需求: (1)object文件放到objs目录下 (2)可执行文件放到exes目录下 (3)增加头文件依赖 ...