3

我想这是不可能的,但我想知道:

您可以将符合特定接口方法(但不使用“实现接口”)的类强制转换为该接口吗?

任何解决方法?我想为某个类使用包装类,但无法访问它的构造函数,也无法修改需要该类的接收代码。

-edit- 抱歉,我不清楚界面。实际上,两条思路合并为一个问题的那些。我应该问一下关于将一个类转换为另一个类的问题。

4

4 回答 4

4

简短的回答是否定的。系统怎么可能知道?这充其量只是巧合。

现在就解决方​​法而言,反射是您的朋友。 甲骨文教程

示例代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Member;
import static java.lang.System.out;

enum ClassMember { CONSTRUCTOR, FIELD, METHOD, CLASS, ALL }

public class ClassSpy {
    public static void main(String... args) {
    try {
        Class<?> c = Class.forName(args[0]);
        out.format("Class:%n  %s%n%n", c.getCanonicalName());

        Package p = c.getPackage();
        out.format("Package:%n  %s%n%n",
               (p != null ? p.getName() : "-- No Package --"));

        for (int i = 1; i < args.length; i++) {
        switch (ClassMember.valueOf(args[i])) {
        case CONSTRUCTOR:
            printMembers(c.getConstructors(), "Constructor");
            break;
        case FIELD:
            printMembers(c.getFields(), "Fields");
            break;
        case METHOD:
            printMembers(c.getMethods(), "Methods");
            break;
        case CLASS:
            printClasses(c);
            break;
        case ALL:
            printMembers(c.getConstructors(), "Constuctors");
            printMembers(c.getFields(), "Fields");
            printMembers(c.getMethods(), "Methods");
            printClasses(c);
            break;
        default:
            assert false;
        }
        }

        // production code should handle these exceptions more gracefully
    } catch (ClassNotFoundException x) {
        x.printStackTrace();
    }
    }
于 2013-01-10T21:33:10.093 回答
1

不,你不能,因为其他海报已经回答了。

对于(丑陋的)解决方法:您可以使用java.lang.Reflection, 访问任何构造函数,甚至是私有构造函数。

通过反射通过私有无参数构造函数实例化对象的示例:

java.lang.reflect.Constructor[] c = clazz.getDeclaredConstructors();
c[0].setAccessible(true);
Object instance = c[0].newInstance(new Object[] {});

但是请注意,在我的生活中,曾经看到一个配置为(通过 SecurityManager)的 VM,使得通过反射访问私有字段不起作用。

于 2013-01-10T21:35:19.380 回答
0

不,但您可以使用适配器设计模式解决此问题。创建一个实现接口的类,并将相关类的实例作为构造函数参数。然后将所有方法委托给这个实例。

于 2013-01-10T21:41:29.947 回答
0

您不能将对象引用转换为不在对象继承链中的类,也不能转换为对象未实现的接口。发生运行时检查以防止这种情况发生。

(当涉及到转换引用数组时,它变得更加严格。)

于 2013-01-10T21:36:04.443 回答