反射作为托管语言的特性,很多框架都依赖反射来实现容器和面向接口编程,对架构程序很重要,首先试验Java的反射部分。
首先创建一个ZLZJar的工程,让他打包成jar包,代码如下
public class Test {
//加两个整数
public int Add(int a,int b) {
return a+b;
}
//说你好
public void Hello() {
System.out.println("Hello My Name Is Lite Gray Fish");
}
}
输出jar包的工程设置
生成jar包
然后创建一个ZLZTestJar工程测试jar包反射调用,代码如下
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.lang.Class;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.jar.JarFile;
import java.util.jar.JarEntry;
//zlz练习
public class Main {
//m主方法
public static void main(String[] args) {
try {
//自己生成jar包路径
URL url = new File("D:\\ZLZJar\\out\\artifacts\\ZLZJar\\ZLZJar.jar").toURI().toURL();
URL[] urls = new URL[]{ url };
//加载程序集
URLClassLoader loader = new URLClassLoader(urls);
//加载类
Class c = loader.loadClass("Test");
//创建对象
Object o = c.newInstance();
//得到方法
Method m = c.getMethod("Hello");
//执行
m.invoke(o);
//有参数的方法通过名称无法得到,自己包装一下
//Method mAdd = c.getMethod("Add");
Method mAdd = GetMethod(c,"Add");
Object ret=mAdd.invoke(o,1,2);
System.out.println("求和结果:"+ret);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
//通过类型和名称得到方法
public static Method GetMethod(Class c,String name) {
Method[] methods = c.getMethods();
for (Method method : methods) {
System.out.println("类名:"+method.getName().intern());
if (method.getName().intern()==name) {
return method;
}
}
return null;
}
}
运行如下
基于反射和接口加上调用编译命令实现动态调用和业务脚本化,积累框架技术点一个,合适自己的就是最好的