我想这是不可能的,但我想知道:
您可以将符合特定接口方法(但不使用“实现接口”)的类强制转换为该接口吗?
任何解决方法?我想为某个类使用包装类,但无法访问它的构造函数,也无法修改需要该类的接收代码。
-edit- 抱歉,我不清楚界面。实际上,两条思路合并为一个问题的那些。我应该问一下关于将一个类转换为另一个类的问题。
简短的回答是否定的。系统怎么可能知道?这充其量只是巧合。
现在就解决方法而言,反射是您的朋友。 甲骨文教程
示例代码:
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();
}
}
不,你不能,因为其他海报已经回答了。
对于(丑陋的)解决方法:您可以使用java.lang.Reflection
, 访问任何构造函数,甚至是私有构造函数。
通过反射通过私有无参数构造函数实例化对象的示例:
java.lang.reflect.Constructor[] c = clazz.getDeclaredConstructors();
c[0].setAccessible(true);
Object instance = c[0].newInstance(new Object[] {});
但是请注意,在我的生活中,曾经看到一个配置为(通过 SecurityManager)的 VM,使得通过反射访问私有字段不起作用。
不,但您可以使用适配器设计模式解决此问题。创建一个实现接口的类,并将相关类的实例作为构造函数参数。然后将所有方法委托给这个实例。
您不能将对象引用转换为不在对象继承链中的类,也不能转换为对象未实现的接口。发生运行时检查以防止这种情况发生。
(当涉及到转换引用数组时,它变得更加严格。)