自然资源部网站绿色矿山建设,建设银行业务管理中心网站,现在最火的社交电商平台,检察院门户网站建设报告Java类动态替换Class
通过Java的Class对象#xff0c;可以实现动态替换Class。 预习几个知识点
getClassLoader
Java提供的ClassLoader可用于动态加载的Java类#xff0c;可以通过多种形式获取ClassLoader。比如通过Class类获取
// 通过Class获取
ClassLoader classLoade…Java类动态替换Class
通过Java的Class对象可以实现动态替换Class。 预习几个知识点
getClassLoader
Java提供的ClassLoader可用于动态加载的Java类可以通过多种形式获取ClassLoader。比如通过Class类获取
// 通过Class获取
ClassLoader classLoader LinduoClass.class.getClassLoader();利用ClassLoader传入ClassName就可以加载类
ClassLoader classLoader LinduoClass.class.getClassLoader();
Class? myClass classLoader.loadClass(com.linduo.test.TestClass);现在可以把Class加载出来。要创建类对象的话需要知道Class的构造函数以及构造函数的各个参数。
getDeclaredConstructors
Java.lang.Class类提供了getDeclaredConstructors。通过这个方法可以获取类中所有声明的构造函数。
ClassLoader classLoader LinduoClass.class.getClassLoader();
Class? myClass classLoader.loadClass(com.linduo.test.TestClass);
// 获取所有构造函数
Constructor?[] methods myClass.getDeclaredConstructors();getParameterTypes
Method类型提供了getParameterTypes方法它用于获取方法的参数类型Constructor也是方法
ClassLoader classLoader LinduoClass.class.getClassLoader();
Class? myClass classLoader.loadClass(com.linduo.test.TestClass);
// 获取所有构造函数
Constructor?[] methods myClass.getDeclaredConstructors();
// 获取构造函数的参数类型
for (ConstructorT method : methods) { // 获取每个构造函数的参数类型Class?[] paramTypes method.getParameterTypes();
}Method类提供的newInstance可以用于创建并返回指定类的实例。
// 可变参数表示要传递给构造函数的参数列表
public Object newInstance(Object... initargs)动态替换Class对象
基于上面的几个方法可以实现动态替换Class对象。比如FunctionA和FunctionB同时继承了FunctionBase。可以在代码中利用上面的方式将FunctionA动态替换为FunctionB。
class FunctionBase
{plublic FunctionBase(int a, int b) {}
}class FunctionA extends FunctionBase
{plublic FunctionA (int a, int b) {super(a, b)}
}class FunctionB extends FunctionBase
{plublic FunctionA (int a, int b) {super(a, b)}
}// 某处代码中将A替换为B。
int arg1 1;
int arg2 2;
FunctionBase myFunction replaceToB(FunctionA.class, arg1 , arg2);上述代码中可以将FunctionA动态替换为FunctionB。Linduo.replaceToB的具体实现如下。
public boolean canReplace(params, classParams) {// 长度不等if (params.length ! classParams.length) {return false;}// 判断参数类型是否相同int count 0;for (int i 0; i params.length; i) {if (params[i] classParams[i]) {count;}}if (count params.length) {// 相等return true;} return false;
}public FunctionBase replaceToB(Class? classA, Object... args) {String name;String nameA classA.getName();if (nameA ! com.linduo.FunctionA) {return null;} else {// 如果是FunctionA类则使用FunctionB代替。name FunctionB.class.getName();}// 加载FunctionB类Class cl Linduo.class.getClassLoader().loadClass(name);// 获取B类的方法ConstructorFunctionBase[] methods cl.getDeclaredConstructors();// 构造参数列表Class?[] params new Class[args.length];for (int i 0; i args.length; i) {params[i] args[i].getClass();}for (ConstructorT method : methods) {// 获取构造函数的参数列表Class?[] classParams method.getParameterTypes();if (canReplace(params, classParams)) {// 如果参数相等设置setAccessible为True用来访问构造函数method.setAccessible(true);return method.newInstance(args);}}return null;
}}