java 从对象获取类_从JAVA 8中的类对象获取方法引用

好吧,使用在运行时指定的类型,即在编译时未知,是Reflection的定义。没有反射,你不能做反射操作。

你可以做的是生成一个功能接口的实例,它可以在不使用反射的情况下实例化类,即在调用接口方法之前解决所有问题,就像编译时已知成员的方法引用在运行时一样:

public static MyFactory getRuntimeClass(Class extends MyClass> cls) {

try {

MethodHandles.Lookup l = MethodHandles.lookup();

MethodHandle c = l.findConstructor(cls,

MethodType.methodType(void.class, String.class));

MethodType ft = c.type().changeReturnType(MyClass.class);

return (MyFactory)LambdaMetafactory.metafactory(l, "getInstance",

MethodType.methodType(MyFactory.class), ft, c, ft).getTarget().invokeExact();

}

catch(RuntimeException | Error t) {

throw t;

}

catch(Throwable t) {

throw new IllegalArgumentException(t);

}

}当然,生成实例是一种具有所有缺点的反射操作,例如仅在运行时检测错误。由于没有编译时检查的安全性,如果您尝试使用通用功能接口,则不会有任何通用类型安全性。

如果您更改了界面并忘记调整此代码,则可能会发生这样的情况,即您在执行此getRuntimeClass方法时甚至没有发现错误,但只有当您实际尝试在生成的实例上调用接口方法时才会发现错误。

与真正的方法引用不同,这不承担任何缓存。没关系,如果你只在初始化时将一些类名映射到MyFactory实例并保留MyFactory实例。但是如果你发现自己不得不重复地将类名映射到MyFactory实例,可能使用相同的名称,你可能想要记住它们。最简单的解决方案是:

static ClassValue MY_FACTORIES = new ClassValue() {

protected MyFactory computeValue(Class> type) {

return getRuntimeClass(type.asSubclass(MyClass.class));

}

};哪个可以用

MyClass mySubClass = MY_FACTORIES.get(Class.forName(args[0])).getInstance("test");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值