我想检查传递给函数的字符串是否会导致它的某个类或子类的实例。以下示例可以解决这个问题,但我正在寻找一种不需要您实例化public InetAddress intToInetAddress(int hostAddress) {
byte[] addressBytes = {(byte) (0xff & hostAddress),
(byte) (0xff & (hostAddress >> 8)),
(byte) (0xff & (hostAddress >> 16)),
(byte) (0xff & (hostAddress >> 24))};
try {
return InetAddress.getByAddress(addressBytes);
} catch (UnknownHostException e) {
throw new AssertionError();
}
}
的解决方案 - 因为我实际上并不需要它。
$className
我有另一种方法来考虑public function register($className, $baseAttributes) {
$instance = new $className;
if (!($instance instanceof AbstractFoo)) {
throw new InvalidArgumentException();
}
...
}
的实例,但是如果在配置期间向方法提供了错误的类,我想尽早失败。 例如:
$className
答案 0 :(得分:4)
嗯,你需要Reflection和两种方法getParentClass()
& isAbstract()
。
以下是您需要的实例。
public function register($className, $baseAttributes) {
$classReflection = new ReflectionClass($className);
$parentClassName = $classReflection->getParentClass()->getName();
if($parentClassName=="AbstractFoo"){
throw new InvalidArgumentException();
}
$parentReflection = new ReflectionClass($parentClassName);
$isAbstract= $parentReflection->isAbstract(); // return true of false
if (!($isAbstract)) {
throw new InvalidArgumentException();
}
//....
}
使用isSubclassOf()
ReflectionClass
方法的其他解决方案
public function register($className, $baseAttributes) {
$classReflection = new ReflectionClass($className);
if($classReflection->isSubclassOf("AbstractFoo")){
throw new InvalidArgumentException();
}
//....
}
答案 1 :(得分:2)
if ($className == 'AbstractFoo' || is_subclass_of($className, 'AbstractFoo')) …
请参阅http://php.net/is_subclass_of。
如果AbstractFoo
确实是abstract
,您实际上可以跳过第一次相等检查,因为它永远不会成立。