Java中Class类的使用
最近遇到一个涉及分类的问题,具体情况是:
对于给定不同的原始输入数据,已经预定义好类别,需要根据预定义好的类别,建立不同的分类实现类,用分类实现类的实例去处理原始输入数据,从而从不同的分类实现类实例中输出,最终得到一个格式化的数据,再在该数据的基础上执行进一步的操作。
因为,对于不同的分类实现类,需要预先加载一些与此种分类操作相关的参数数据,我想使用static静态代码段来实现,因此将每一个分类实现类中的分类方法声明为static的,从而整个实现类主要是基于调用static的分类方法来实现主要的分类功能。
因此,主要的问题就是,根据输入原始数据实现自动调用分类实现类的static分类核心方法来执行分类操作,那么也就是要获取到该实现类,并自动调用static的方法,其实也很容易地就会想到Java的反射机制,这里使用到Class类的功能。
现在假设存在两个分类实现:ArtificialClassification类与FuzzyClassification类。
第一个分类实现类的具体代码模拟为:
第二个分类实现类的具体代码模拟为:
现在,在两个分类实现类中,都具有无参数的classify方法,如果想要能够自动调用无参数的classify方法,只需要调用Class的 getDeclaredMethod方法,并在得到的方法类Method的实例,进而调用invoke方法,并传入参数null就可以实现,如下所示:
执行程序,可以看到调用了org.shirdrn.tech.FuzzyClassification类的无参数classify方法:
Fuzzy classification.
如果想要调用具有参数的classify方法,需要设置Class类的getDeclaredMethod方法的第二个参数为一个参数类型的数组Class[],同时在调用Method的invoke方法时传入参数值执行处理,如下所示:
执行程序,就能够调用分类实现类org.shirdrn.tech.FuzzyClassification的带参数的classify方法:
这样,对于不同的具有核心处理的static方法的分类实现类,只需要在数据输入类中注册一下,然后通过Class类的反射方法实现自动指派数据到指定的分类处理实现类中去执行特定的操作。
对于给定不同的原始输入数据,已经预定义好类别,需要根据预定义好的类别,建立不同的分类实现类,用分类实现类的实例去处理原始输入数据,从而从不同的分类实现类实例中输出,最终得到一个格式化的数据,再在该数据的基础上执行进一步的操作。
因为,对于不同的分类实现类,需要预先加载一些与此种分类操作相关的参数数据,我想使用static静态代码段来实现,因此将每一个分类实现类中的分类方法声明为static的,从而整个实现类主要是基于调用static的分类方法来实现主要的分类功能。
因此,主要的问题就是,根据输入原始数据实现自动调用分类实现类的static分类核心方法来执行分类操作,那么也就是要获取到该实现类,并自动调用static的方法,其实也很容易地就会想到Java的反射机制,这里使用到Class类的功能。
现在假设存在两个分类实现:ArtificialClassification类与FuzzyClassification类。
第一个分类实现类的具体代码模拟为:
package org.shirdrn.tech;
public class ArtificialClassification {
static {
// 省略了参数数据的静态加载
}
public static void classify() {
System.out.println("Artificial classification.");
}
}
第二个分类实现类的具体代码模拟为:
package org.shirdrn.tech;
public class FuzzyClassification {
static {
// 省略了参数数据的静态加载
}
public static void classify() {
System.out.println("Fuzzy classification.");
}
public static void classify(Boolean autoStored, Integer batchSize) {
classify();
if(autoStored) {
System.out.println("Fuzzy classification : Stored.");
System.out.println("Fuzzy classification : Stored batchSize is : " + batchSize +".");
}
}
}现在,在两个分类实现类中,都具有无参数的classify方法,如果想要能够自动调用无参数的classify方法,只需要调用Class的 getDeclaredMethod方法,并在得到的方法类Method的实例,进而调用invoke方法,并传入参数null就可以实现,如下所示:
package org.shirdrn.tech;
import java.util.HashMap;
import java.util.Map;
public class DataEntrance {
private static Map<Integer, String> classNamesMap;
static {
classNamesMap = new HashMap<Integer, String>();
classNamesMap.put(01, "org.shirdrn.tech.ArtificialClassification");
classNamesMap.put(02, "org.shirdrn.tech.FuzzyClassification");
}
@SuppressWarnings("unchecked")
public static void mine() throws Exception {
// 调用无参数的方法
Class<Object> clazz = (Class<Object>)Class.forName(classNamesMap.get(02));
clazz.getDeclaredMethod("classify", new Class[]{}).invoke(null, null);
}
public static void main(String[] args) {
try {
mine();
} catch (Exception e) {
e.printStackTrace();
}
}
}执行程序,可以看到调用了org.shirdrn.tech.FuzzyClassification类的无参数classify方法:
Fuzzy classification.
如果想要调用具有参数的classify方法,需要设置Class类的getDeclaredMethod方法的第二个参数为一个参数类型的数组Class[],同时在调用Method的invoke方法时传入参数值执行处理,如下所示:
package org.shirdrn.tech;
import java.util.HashMap;
import java.util.Map;
public class DataEntrance {
private static Map<Integer, String> classNamesMap;
static {
classNamesMap = new HashMap<Integer, String>();
classNamesMap.put(01, "org.shirdrn.tech.ArtificialClassification");
classNamesMap.put(02, "org.shirdrn.tech.FuzzyClassification");
}
@SuppressWarnings("unchecked")
public static void mine() throws Exception {
Class<Object> clazz = (Class<Object>)Class.forName(classNamesMap.get(02));
// 调用带参数的classify方法
Class[] clazzArray = new Class[]{
Class.forName("java.lang.Boolean"),
Class.forName("java.lang.Integer")
};
Object[] parameters = new Object[]{
true,
123000000
};
clazz.getDeclaredMethod("classify", clazzArray).invoke(null, parameters); // 因为底层方法是静态的,invoke方法第一个参数设置为null
}
public static void main(String[] args) {
try {
mine();
} catch (Exception e) {
e.printStackTrace();
}
}
}执行程序,就能够调用分类实现类org.shirdrn.tech.FuzzyClassification的带参数的classify方法:
这样,对于不同的具有核心处理的static方法的分类实现类,只需要在数据输入类中注册一下,然后通过Class类的反射方法实现自动指派数据到指定的分类处理实现类中去执行特定的操作。