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建议的评论中所承诺的,我正在提交我投入使用的代码。这似乎对我有用