Lấy tất cả phương thức static trong 1 tệp - Java

Em đang có 1 bài tập lấy tất cả chữ ký !
Em định dùng Reflection nhưng tham số truyền vào là nội dung của tệp cần xử lý nên e không biết xử lý sao!
Anh chị giúp em với ạ

Đề bài: cài đặt phương thức List<String> getAllFunctions(String fileContent) để lấy toàn bộ chữ ký các phương thức static (method signature) trong một tệp cho trước qua các phép xử lý xâu, trong đó fileContent là nội dung tệp bạn cần xử lý. Mỗi một phần tử String trong đối tượng trả về lưu mã nguồn phương thức static tìm được.

Định dạng chữ ký phương thức được quy định theo định dạng:

methodName(parameter1_type,parameter2_type,...)

Chú ý là parameter1_type, parameter2_type,… phải là Fully Qualified Type Name

Dưới đây là một số ví dụ:

public static void sayHello() {}
=> sayHello()
---------------------------------------------
public static int add(int a, int b) {}
=> add(int,int)
---------------------------------------------
public static void printMessage(String message) {}
=> printMessage(java.lang.String)
---------------------------------------------
public static void printMessages(String[] messages) {}
=> printMessages(java.lang.String[])
---------------------------------------------
import java.io.File;
public static String readFile(File file) {}
=> readFile(java.io.File)
---------------------------------------------
// tệp này có 2 lớp
package net.bqc.utils;
class Message {}
public static void printMessage(Message message) {}
=> printMessage(net.bqc.utils.Message)
---------------------------------------------
// tệp này có 2 lớp
package net.bqc.utils;
import java.util.List;
class Message {}
public static void printMessages(List<Message> messages) {}
=> printMessages(java.util.List<net.bqc.utils.Message>)
1 Like

bạn dùng regex nhé :slight_smile:

  • regex lần thứ nhất lấy tất cả chuỗi có dạng: static void printX(X args)
/(static).+\)/m
  • regex lần thứ 2 từ static void printX(X args) lấy tên hàm dạng: printX(X args)
/\S+\(.+$/m
  • regex lần thứ 3 từ printX(X args) lấy tên hàm: printX —> lưu
/^\w+/m
  • regex lần thứ 4 từ printX(X args) lấy được: X args
/(\w+\s\w+)|(\w+\[]+\s\w+)/m
  • regex lần thứ 5 từ X args hoặc X[] args lấy được: X —> lưu
/^\w+/m
5 Likes

dạ em cảm ơn ạ
em mới năm nhất nên cũng chưa học được nhiều về regex
anh có thể code cho em tham khảo được không ạ

tập search đi bạn
mình tạo dùm bạn phần khó nhất là tìm regex tổng quát rồi
mình còn phải ngạc nhiên vì thậm chí nó ko quan tâm syntax :expressionless::expressionless::expressionless::expressionless:

4 Likes

dạ thưa anh nhưng đề bài yêu cần in ra cả đường dẫn
ví dụ public static void printMessages(List<Message> messages) {}
nó sẽ in ra printMessages(java.util.List<net.bqc.utils.Message>)
thay vì printMessages(List<Message> messages)

Coi chừng bị “chơi xỏ”.
Trong tập tin mà có vài chuỗi dạng:

package no.no.no;

// static int thisIsStaticMethod(){}
public class Troll{
   String hehe = "public static String hehe(String a, List b, Object...c){}";
   public void method(){
      String haha = "\"\"public static void haha(int x, String y, List z){}\"\"";
   }
}
public static void main(){} // Wrong side of the tracks!

Thế là…

Có 1 cách mà có thể thực hiện theo ý đồ (reflection) của bạn: dùng javac để biên dịch thành tập tin .class (nếu biên dịch không được => lỗi cú pháp), sau đó dùng URLClassLoader để nạp tập tin đã được biên dịch, sau đó chỉ cần dùng reflection để lấy.

Tham khảo:


Nhớ lúc trước cũng mày mò nạp các lớp động (trong khi thực thi) để làm “plugin” cho Java và cả C#. :smiling_imp:

10 Likes

@SITUVN.gcd
bác ác quá coi chừng đi ị khó đó nhé haha :poop::poop::poop::poop::poop:
theo đề thớt đòi xử lí xâu mà bác còn chơi như thế thì… :face_with_hand_over_mouth::face_with_hand_over_mouth::face_with_hand_over_mouth::face_with_hand_over_mouth::face_with_hand_over_mouth:

3 Likes

dạ em cảm ơn anh ạ
đúng thứ em đang cần

Hi bạn Tím, k hiểu sao tôi rất thích cà khịa bạn @TyE =))))

Như 1 gáo nước tạt thẳng mặt. ahehe

1 Like

Không sao đâu bạn @DoTran1 , vì hà mã nằm dưới nước 16 tiếng mỗi ngày lận :crazy_face::crazy_face::crazy_face:
chỉ nhú 2 cái lỗ mũi lên thôi :nose::nose::nose::nose::nose:

3 Likes

nhưng đề yêu cầu xử lí 1 nội dung file cho trước dạng String thì làm sao có thể sử dụng javac ạ?

Xử lý nội dung gì? Mã Java hay dữ liệu gì?

Mình cũng đang bí bài này =)))

anh có thể hướng dẫn lại em tham khảo với được không ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?