Java 匿名类的原始FQDN
我想按属性的类在Java 匿名类的原始FQDN,java,reflection,anonymous-class,Java,Reflection,Anonymous Class,我想按属性的类在映射中存储属性,即映射应该只包含一个任何运行时类型的对象。目前已经有一个实现(它是一个现有的项目),该机制是通过映射实现的 目前的执行情况: import com.foo.IConfiguration; public class ClientCode { private Options options = new Options(); public void putMethod() { options.subOptions(new IConfigu
映射中存储属性,即映射应该只包含一个任何运行时类型的对象。目前已经有一个实现(它是一个现有的项目),该机制是通过映射实现的
目前的执行情况:
import com.foo.IConfiguration;
public class ClientCode {
private Options options = new Options();
public void putMethod() {
options.subOptions(new IConfiguration() {
public void configure() {}
});
}
public Object getMethod() {
return options.getSubOption(IConfiguration.class);
}
}
public class Options {
private Map<String, Object> map = new HashMap<>();
public void subOptions(Object subOptionsValue) {
if (subOptionsValue != null) {
map.put(subOptionsValue.getClass().getName(), subOptionsValue);
}
}
public Object getSubOption(Class<?> subOptionsClass) {
return subOptionsClass == null ? null : map.get(subOptionsClass.getName());
}
}
导入com.foo.i配置;
公共类客户端代码{
私有选项=新选项();
公共方法(){
选项.子选项(新的IConfiguration(){
public void configure(){}
});
}
公共对象getMethod(){
返回options.getSubOption(IConfiguration.class);
}
}
公共类选项{
私有映射映射=新的HashMap();
公共无效子选项(对象子选项值){
if(子选项值!=null){
put(subOptionsValue.getClass().getName(),subOptionsValue);
}
}
公共对象getSubOption(类子选项类){
返回suboptionClass==null?null:map.get(suboptionClass.getName());
}
}
但是,对于匿名类,这并不像我希望的那样有效。在这种情况下,getName()
和相关方法将放置Options$1
或类似的内容,而我需要它来放置com.foo.IConfiguration
,以便在我的getMethod()中可靠地使用它
我已经浏览了java.lang.Class
的API,但是我找不到任何东西可以让我回到com.foo.IConfiguration
的定义。嗯,我可以,但这不是万无一失的:clazz.getInterfaces()
提供了一个接口数组,这在这里很好,但我也可以创建一个new Object(){}
或一个本地类,或一个常规的公共类
那么,有没有一种合适的方法可以毫不含糊地检索匿名类的接口或超类的FQDN呢?匿名类没有您可以依赖的完全限定名,但是您可以通过ob.getClass().isAnonymousClass()
检查对象是否是匿名类。然后,只有当返回true时,才能检索超类或超接口
您还应该至少考虑处理lambda,即使您还不打算在Java 8上运行它。匿名类没有可以依赖的完全限定名,但您可以通过ob.getClass().isAnonymousClass()检查对象是否为匿名类。
。然后,只有当返回true时,才能检索超类或超接口
您还应该至少考虑处理lambda,即使您还不打算在Java 8上运行它。匿名类没有可以依赖的完全限定名,但您可以通过ob.getClass().isAnonymousClass()检查对象是否为匿名类。
。然后,只有当返回true时,才能检索超类或超接口
您还应该至少考虑处理lambda,即使您还不打算在Java 8上运行它。匿名类没有可以依赖的完全限定名,但您可以通过ob.getClass().isAnonymousClass()检查对象是否为匿名类。
。然后,只有当返回true时,才能检索超类或超接口
您还应该至少考虑处理lambda,即使您还不打算在Java 8上运行它。我建议您将对象按其所有接口、基类和接口的超级接口等多次放入映射中
比如你有
interface I1 {}
interface I2 extends I1 {}
class C1 {}
class C2 extends C1 implements I2{}
然后将C2
的实例放入选项中
您可能希望通过I1.class
或C1.class
但是在这种情况下,如果您有两个实现一个接口的类,那么您需要为可能出现的歧义做好准备
对于这种情况,您可能希望能够显式指定可用于检索特定类的类和接口的列表。我建议您将对象按其所有接口、基类和接口的超级接口等多次放入映射中
比如你有
interface I1 {}
interface I2 extends I1 {}
class C1 {}
class C2 extends C1 implements I2{}
然后将C2
的实例放入选项中
您可能希望通过I1.class
或C1.class
但是在这种情况下,如果您有两个实现一个接口的类,那么您需要为可能出现的歧义做好准备
对于这种情况,您可能希望能够显式指定可用于检索特定类的类和接口的列表。我建议您将对象按其所有接口、基类和接口的超级接口等多次放入映射中
比如你有
interface I1 {}
interface I2 extends I1 {}
class C1 {}
class C2 extends C1 implements I2{}
然后将C2
的实例放入选项中
您可能希望通过I1.class
或C1.class
但是在这种情况下,如果您有两个实现一个接口的类,那么您需要为可能出现的歧义做好准备
对于这种情况,您可能希望能够显式指定可用于检索特定类的类和接口的列表。我建议您将对象按其所有接口、基类和接口的超级接口等多次放入映射中
比如你有
interface I1 {}
interface I2 extends I1 {}
class C1 {}
class C2 extends C1 implements I2{}
然后将C2
的实例放入选项中
您可能希望通过I1.class
或C1.class
但是在这种情况下,如果您有两个实现一个接口的类,那么您需要为可能出现的歧义做好准备
对于这种情况,您可能希望能够显式指定可用于检索特定类的类和接口列表。正如对biziclop建议的评论中所承诺的,我正在提交我投入使用的代码。这似乎对我有用