Java 我能知道给定的方法是否存在吗?

Java 我能知道给定的方法是否存在吗?,java,generics,Java,Generics,我想知道在Java中是否不仅可以检查instanceof,还可以检查给定方法是否可用于泛型类型变量 new LruCache<K, V>(size) { @Override protected int sizeOf(final K key, final V value) { // if (value hasmethod getByteCount) return super.sizeOf(key, value); } }; 新L

我想知道在Java中是否不仅可以检查
instanceof
,还可以检查给定方法是否可用于泛型类型变量

new LruCache<K, V>(size) {
    @Override
    protected int sizeOf(final K key, final V value) {
        // if (value hasmethod getByteCount)
        return super.sizeOf(key, value);
    }
};
新LruCache(尺寸){
@凌驾
受保护的int sizeOf(最终K键,最终V值){
//if(值hasmethod getByteCount)
返回super.sizeOf(键,值);
}
};

它存在吗?

一个更好的解决方案是将
V
限制在一个带有该方法的接口上。但如果你不能做到这一点:

boolean hasMethod = false;
try { 
  Method m = value.getClass().getDeclaredMethod("byteCount", null); 
  hasMethod = true;
}
catch (NoSuchMethodException e) {
}
catch (SecurityException e) { 
  // you don't have access to the method from your package
}
假设您在该方法上没有参数。否则,将参数类型作为参数传递到
getDeclaredMethod

如果方法是公共的,请改用
getMethod

EDIT注释正确地指出,这不会从超类型获取方法。如果需要,您可以使用此方法(它跳过
Object
方法,因为所有对象都有这些方法,因此对继承的其中一个方法的测试毫无价值):

布尔hasInheritedDeclaredMethod(V值,String方法名)
{
c类=value.getClass();
布尔方法=假;
而(!hasMethod&&c!=Object.class){
试试{
方法m=c.getDeclaredMethod(methodName,null);
hasMethod=true;
}
catch(NoSuchMethodException){}
//您没有从包访问该方法的权限
catch(SecurityException e){break;}
如果(!hasMethod&&c!=Object.class)
c=c.getSuperclass();
}
返回法;
}

一个更好的解决方案是将
V
限制在一个带有该方法的接口上。但如果你不能做到这一点:

boolean hasMethod = false;
try { 
  Method m = value.getClass().getDeclaredMethod("byteCount", null); 
  hasMethod = true;
}
catch (NoSuchMethodException e) {
}
catch (SecurityException e) { 
  // you don't have access to the method from your package
}
假设您在该方法上没有参数。否则,将参数类型作为参数传递到
getDeclaredMethod

如果方法是公共的,请改用
getMethod

EDIT注释正确地指出,这不会从超类型获取方法。如果需要,您可以使用此方法(它跳过
Object
方法,因为所有对象都有这些方法,因此对继承的其中一个方法的测试毫无价值):

布尔hasInheritedDeclaredMethod(V值,String方法名)
{
c类=value.getClass();
布尔方法=假;
而(!hasMethod&&c!=Object.class){
试试{
方法m=c.getDeclaredMethod(methodName,null);
hasMethod=true;
}
catch(NoSuchMethodException){}
//您没有从包访问该方法的权限
catch(SecurityException e){break;}
如果(!hasMethod&&c!=Object.class)
c=c.getSuperclass();
}
返回法;
}

一个更好的解决方案是将
V
限制在一个带有该方法的接口上。但如果你不能做到这一点:

boolean hasMethod = false;
try { 
  Method m = value.getClass().getDeclaredMethod("byteCount", null); 
  hasMethod = true;
}
catch (NoSuchMethodException e) {
}
catch (SecurityException e) { 
  // you don't have access to the method from your package
}
假设您在该方法上没有参数。否则,将参数类型作为参数传递到
getDeclaredMethod

如果方法是公共的,请改用
getMethod

EDIT注释正确地指出,这不会从超类型获取方法。如果需要,您可以使用此方法(它跳过
Object
方法,因为所有对象都有这些方法,因此对继承的其中一个方法的测试毫无价值):

布尔hasInheritedDeclaredMethod(V值,String方法名)
{
c类=value.getClass();
布尔方法=假;
而(!hasMethod&&c!=Object.class){
试试{
方法m=c.getDeclaredMethod(methodName,null);
hasMethod=true;
}
catch(NoSuchMethodException){}
//您没有从包访问该方法的权限
catch(SecurityException e){break;}
如果(!hasMethod&&c!=Object.class)
c=c.getSuperclass();
}
返回法;
}

一个更好的解决方案是将
V
限制在一个带有该方法的接口上。但如果你不能做到这一点:

boolean hasMethod = false;
try { 
  Method m = value.getClass().getDeclaredMethod("byteCount", null); 
  hasMethod = true;
}
catch (NoSuchMethodException e) {
}
catch (SecurityException e) { 
  // you don't have access to the method from your package
}
假设您在该方法上没有参数。否则,将参数类型作为参数传递到
getDeclaredMethod

如果方法是公共的,请改用
getMethod

EDIT注释正确地指出,这不会从超类型获取方法。如果需要,您可以使用此方法(它跳过
Object
方法,因为所有对象都有这些方法,因此对继承的其中一个方法的测试毫无价值):

布尔hasInheritedDeclaredMethod(V值,String方法名)
{
c类=value.getClass();
布尔方法=假;
而(!hasMethod&&c!=Object.class){
试试{
方法m=c.getDeclaredMethod(methodName,null);
hasMethod=true;
}
catch(NoSuchMethodException){}
//您没有从包访问该方法的权限
catch(SecurityException e){break;}
如果(!hasMethod&&c!=Object.class)
c=c.getSuperclass();
}
返回法;
}

您可以使用org.springframework.util.ReflectionUtils

public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
公共静态方法findMethod(类clazz、字符串名称、类…paramTypes)

从类或超类获取方法。

可以使用org.springframework.util.ReflectionUtils

public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
公共静态方法findMethod(类clazz、字符串名称、类…paramTypes)

从类或超类获取方法。

可以使用org.springframework.util.ReflectionUtils

public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
公共静态方法findMethod(类clazz、字符串名称、类…paramTypes)

从类或超类获取方法。

可以使用org.springframework.util.ReflectionUtils

public static Method findMethod(Class<?> clazz, String name, Class<?>... paramTypes)
公共静态方法findMethod(类clazz、字符串名称、类…paramTypes)