Java 接受一个方法作为另一个方法的输入参数
我看到一些API接受方法作为参数。但不知道它们实际上是如何工作的。可能在内部使用了一些反射,但不知道如何使用 请告诉我如何编写一个可以接受方法作为输入的方法?比如,Java 接受一个方法作为另一个方法的输入参数,java,reflection,Java,Reflection,我看到一些API接受方法作为参数。但不知道它们实际上是如何工作的。可能在内部使用了一些反射,但不知道如何使用 请告诉我如何编写一个可以接受方法作为输入的方法?比如, someMethod(on(SomeClass.class).someMethod()); 备选方案: someMethod("fieldName" , SomeClass.class); 但它不是类型安全的。创建枚举将是一个额外的负担。在java中,这通常是通过实现或的类来完成的 因此,不是传递函数,而是传递具有可调用函数的对
someMethod(on(SomeClass.class).someMethod());
备选方案:
someMethod("fieldName" , SomeClass.class);
但它不是类型安全的。创建枚举将是一个额外的负担。在java中,这通常是通过实现或的类来完成的
因此,不是传递函数,而是传递具有可调用函数的对象 在java中,这通常是通过实现或
因此,不是传递函数,而是传递具有可调用函数的对象 在Java中,您通常会编写如下接口:
public interface Function{
public void apply();
}
static void main( String args[] ){
callSomeMethod( new Function(){
public void apply(){
System.out.println( "hurray" );
}
} );
}
static void callSomeMethod( Function f ){
f.apply();
}
class Thing{
public void whatever(){
System.out.println( "hi!" );
}
}
public static void main( String args[] ){
Thing thing = new Thing();
callSomeMethod( thing, "whatever" );
}
public static void callSomeMethod( Object obj, String methodName ){
obj.getClass().getMethod( methodName ).invoke( obj );
}
然后您可以像这样使用您的函数:
public interface Function{
public void apply();
}
static void main( String args[] ){
callSomeMethod( new Function(){
public void apply(){
System.out.println( "hurray" );
}
} );
}
static void callSomeMethod( Function f ){
f.apply();
}
class Thing{
public void whatever(){
System.out.println( "hi!" );
}
}
public static void main( String args[] ){
Thing thing = new Thing();
callSomeMethod( thing, "whatever" );
}
public static void callSomeMethod( Object obj, String methodName ){
obj.getClass().getMethod( methodName ).invoke( obj );
}
在Java8中,通过添加lambdas,这将大大简化。
但就目前而言,java就是这样做的
内置类
Java有一些内置类是泛型的。例如,看看callable:
倒影
也可以使用反射。上面的示例如下所示:
public interface Function{
public void apply();
}
static void main( String args[] ){
callSomeMethod( new Function(){
public void apply(){
System.out.println( "hurray" );
}
} );
}
static void callSomeMethod( Function f ){
f.apply();
}
class Thing{
public void whatever(){
System.out.println( "hi!" );
}
}
public static void main( String args[] ){
Thing thing = new Thing();
callSomeMethod( thing, "whatever" );
}
public static void callSomeMethod( Object obj, String methodName ){
obj.getClass().getMethod( methodName ).invoke( obj );
}
但是,与上面的方法相比,反射速度非常慢,并且您还失去了静态类型安全性。总而言之,如果不是绝对必要的话,我建议不要这样做 在Java中,您通常会编写如下接口:
public interface Function{
public void apply();
}
static void main( String args[] ){
callSomeMethod( new Function(){
public void apply(){
System.out.println( "hurray" );
}
} );
}
static void callSomeMethod( Function f ){
f.apply();
}
class Thing{
public void whatever(){
System.out.println( "hi!" );
}
}
public static void main( String args[] ){
Thing thing = new Thing();
callSomeMethod( thing, "whatever" );
}
public static void callSomeMethod( Object obj, String methodName ){
obj.getClass().getMethod( methodName ).invoke( obj );
}
然后您可以像这样使用您的函数:
public interface Function{
public void apply();
}
static void main( String args[] ){
callSomeMethod( new Function(){
public void apply(){
System.out.println( "hurray" );
}
} );
}
static void callSomeMethod( Function f ){
f.apply();
}
class Thing{
public void whatever(){
System.out.println( "hi!" );
}
}
public static void main( String args[] ){
Thing thing = new Thing();
callSomeMethod( thing, "whatever" );
}
public static void callSomeMethod( Object obj, String methodName ){
obj.getClass().getMethod( methodName ).invoke( obj );
}
在Java8中,通过添加lambdas,这将大大简化。
但就目前而言,java就是这样做的
内置类
Java有一些内置类是泛型的。例如,看看callable:
倒影
也可以使用反射。上面的示例如下所示:
public interface Function{
public void apply();
}
static void main( String args[] ){
callSomeMethod( new Function(){
public void apply(){
System.out.println( "hurray" );
}
} );
}
static void callSomeMethod( Function f ){
f.apply();
}
class Thing{
public void whatever(){
System.out.println( "hi!" );
}
}
public static void main( String args[] ){
Thing thing = new Thing();
callSomeMethod( thing, "whatever" );
}
public static void callSomeMethod( Object obj, String methodName ){
obj.getClass().getMethod( methodName ).invoke( obj );
}
但是,与上面的方法相比,反射速度非常慢,并且您还失去了静态类型安全性。总而言之,如果不是绝对必要的话,我建议不要这样做 实现这一点的一般方法是可调用的,但java中的大多数传递方法通常是通过创建接口来完成的。在接口内部,您定义了几个反映您想要做什么的方法,然后将实现该接口的类作为方法参数传递。实现这一点的一般方法是可调用的,但java中的大多数传递方法通常是通过创建接口来完成的。在接口内部,您定义了几个反映您想要做什么的方法,然后将实现接口的类作为方法参数传递。如果类中已经存在该方法,则可以使用java反射。 看看这里
如果类中已经存在该方法,则可以使用java反射。 看看这里
您确定这是一个方法而不是字段名吗?因为它看起来像一个字段名。你的意思是像这样的
someMethod(obj.getFoo())
?是的,它是一个字段的getter方法。对不起,打错了。我更新了问题请参考并使用java反射方法类作为类型您确定它是方法而不是字段名吗?因为它看起来像一个字段名。你的意思是像这样的someMethod(obj.getFoo())
?是的,它是一个字段的getter方法。对不起,打错了。我已经更新了这个问题,请参考并使用java反射方法类typeyes和no。runnable是一个具有具体用途的类。我更喜欢使用更通用的。在需要参数的情况下,您必须编写自己的接口。@kritzikratzi谢谢,我在学校只在几门课上使用过java,我很幸运能记住这么多;)是和否。runnable是一个有具体用途的类。我更喜欢使用更通用的。在需要参数的情况下,您必须编写自己的接口。@kritzikratzi谢谢,我在学校只在几门课上使用过java,我很幸运能记住这么多;)