@@ -61,6 +61,8 @@ impl String {
6161 JavaMethodProto :: new( "indexOf" , "(Ljava/lang/String;)I" , Self :: index_of_string, Default :: default ( ) ) ,
6262 JavaMethodProto :: new( "indexOf" , "(Ljava/lang/String;I)I" , Self :: index_of_string_from, Default :: default ( ) ) ,
6363 JavaMethodProto :: new( "trim" , "()Ljava/lang/String;" , Self :: trim, Default :: default ( ) ) ,
64+ JavaMethodProto :: new( "startsWith" , "(Ljava/lang/String;)Z" , Self :: starts_with, Default :: default ( ) ) ,
65+ JavaMethodProto :: new( "startsWith" , "(Ljava/lang/String;I)Z" , Self :: starts_with_offset, Default :: default ( ) ) ,
6466 ] ,
6567 fields : vec ! [ JavaFieldProto :: new( "value" , "[C" , Default :: default ( ) ) ] ,
6668 }
@@ -395,6 +397,31 @@ impl String {
395397 Ok ( JavaLangString :: from_rust_string ( jvm, & upper) . await ?. into ( ) )
396398 }
397399
400+ async fn starts_with ( jvm : & Jvm , _: & mut RuntimeContext , this : ClassInstanceRef < Self > , prefix : ClassInstanceRef < Self > ) -> Result < bool > {
401+ tracing:: debug!( "java.lang.String::startsWith({:?}, {:?})" , & this, & prefix) ;
402+
403+ jvm. invoke_virtual ( & this, "startsWith" , "(Ljava/lang/String;I)Z" , ( prefix, 0 ) ) . await
404+ }
405+
406+ async fn starts_with_offset (
407+ jvm : & Jvm ,
408+ _: & mut RuntimeContext ,
409+ this : ClassInstanceRef < Self > ,
410+ prefix : ClassInstanceRef < Self > ,
411+ offset : i32 ,
412+ ) -> Result < bool > {
413+ tracing:: debug!( "java.lang.String::startsWith({:?}, {:?}, {})" , & this, & prefix, offset) ;
414+
415+ let this_string = JavaLangString :: to_rust_string ( jvm, & this. clone ( ) )
416+ . await ?
417+ . chars ( )
418+ . skip ( offset as usize )
419+ . collect :: < RustString > ( ) ;
420+ let prefix_string = JavaLangString :: to_rust_string ( jvm, & prefix. clone ( ) ) . await ?;
421+
422+ Ok ( this_string. starts_with ( & prefix_string) )
423+ }
424+
398425 fn decode_str ( charset : & str , bytes : & [ u8 ] ) -> RustString {
399426 match charset {
400427 "UTF-8" => str:: from_utf8 ( bytes) . unwrap ( ) . to_string ( ) ,
@@ -513,4 +540,37 @@ mod test {
513540
514541 Ok ( ( ) )
515542 }
543+
544+ #[ tokio:: test]
545+ async fn test_starts_with ( ) -> Result < ( ) > {
546+ let jvm = test_jvm ( ) . await ?;
547+
548+ let string = JavaLangString :: from_rust_string ( & jvm, "123 테스트 456" ) . await ?;
549+
550+ let pattern = JavaLangString :: from_rust_string ( & jvm, "123" ) . await ?;
551+ let result: bool = jvm. invoke_virtual ( & string, "startsWith" , "(Ljava/lang/String;)Z" , ( pattern, ) ) . await ?;
552+ assert ! ( result) ;
553+
554+ let pattern = JavaLangString :: from_rust_string ( & jvm, "456" ) . await ?;
555+ let result: bool = jvm. invoke_virtual ( & string, "startsWith" , "(Ljava/lang/String;)Z" , ( pattern, ) ) . await ?;
556+ assert ! ( !result) ;
557+
558+ let pattern = JavaLangString :: from_rust_string ( & jvm, "123 테스트" ) . await ?;
559+ let result: bool = jvm. invoke_virtual ( & string, "startsWith" , "(Ljava/lang/String;)Z" , ( pattern, ) ) . await ?;
560+ assert ! ( result) ;
561+
562+ let pattern = JavaLangString :: from_rust_string ( & jvm, "테스트" ) . await ?;
563+ let result: bool = jvm. invoke_virtual ( & string, "startsWith" , "(Ljava/lang/String;)Z" , ( pattern, ) ) . await ?;
564+ assert ! ( !result) ;
565+
566+ let pattern = JavaLangString :: from_rust_string ( & jvm, "테스트" ) . await ?;
567+ let result: bool = jvm. invoke_virtual ( & string, "startsWith" , "(Ljava/lang/String;I)Z" , ( pattern, 4 ) ) . await ?;
568+ assert ! ( result) ;
569+
570+ let pattern = JavaLangString :: from_rust_string ( & jvm, "테스트" ) . await ?;
571+ let result: bool = jvm. invoke_virtual ( & string, "startsWith" , "(Ljava/lang/String;I)Z" , ( pattern, 5 ) ) . await ?;
572+ assert ! ( !result) ;
573+
574+ Ok ( ( ) )
575+ }
516576}
0 commit comments