使用过滤器设计模式。
我有一个Context接口,有实现这个接口的具体类,叫做f.e. BehavioralPurpose和StructuralPurpose。
我目前正在努力实现的是,当我添加CreationalPurpose类并将其作为前端选项提供时,一切都将继续顺利进行(过滤)
我有一个jsp会返回一个像'结构','行为'等
但是现在我需要创建一个StructuralPurpose类的实例。就像Context context= new StructuralPurpose();
但我不知道我是否会得到结构性的#39}。或者'行为'我不想通过添加if语句来解决这个问题,主要是因为如果有人会添加一个新的Purpose类,那么这个人就不必在此过滤器中添加另一个if语句。
这可能吗?我在考虑可能有一个名为purposeString的字符串并解决这个问题:
String purpose = purposeString + "Purpose";
Context context = Class.forName(purpose).newInstance();
但这会导致错误说:类型不匹配:无法从捕获#1转换?上下文
这有可能吗?
使用(Context) Class.forName(purpose).newInstance();
的强制转换,我将得到一个ClassNotFoundException。这些课程在不同的课程中,不确定这是否重要。这是我使用的代码:
String behav = "filter.Behavioral";
String purpo = behav+"Purpose";
Context behavioral = null;
try {
behavioral = (Context) Class.forName(purpo).newInstance();
} catch (InstantiationException e) {
System.out.println("\n basically failed");
} catch (IllegalAccessException e) {
System.out.println("\n not allowed");
} catch (ClassNotFoundException e) {
System.out.println("\n not found");
}
仅用于测试目的,此代码将返回' not found'。
答案 0 :(得分:0)
一般来说,允许用户动态创建这样的对象并不是一个好习惯,除非你的情况有限并且您可以完全控制所有方面和可能的例外情况 无论如何,如果你有足够的理由这样做,你只需要施展它:
try
{
String purpose = "com.path.to.your.package." + purposeString + "Purpose";
Context context = (Context) Class.forName(purpose).newInstance();
}
catch(ClassNotFoundException ex)
{
ex.printStackTrace();
}