2011-04-07 26 views
14

Vui lòng xem ví dụ sau, lệnh gọi đầu tiên đến getMethod() tạo Cảnh báo trong Eclipse. Cách thứ hai không hoạt động và không thành công với NoSuchMethodException.Đối số của loại null phải được đúc thành Lớp <?> [] để gọi phương thức varargs

The argument of type null should explicitly be cast to Class<?>[] for the invocation of the varargs method getMethod(String, Class<?>...) from type Class<Example> . It could alternatively be cast to Class for a varargs invocation.

Tôi đã theo dõi cảnh báo và không còn hoạt động nữa.

import java.lang.reflect.Method; 


public class Example 
{ 
    public void exampleMethod() { } 

    public static void main(String[] args) throws Throwable 
    { 
    Method defaultNull = Example.class.getMethod("exampleMethod", null);   
    Method castedNull = Example.class.getMethod("exampleMethod", (Class<?>) null); 
} 
} 

Cuộc gọi thứ hai tạo ra lỗi này:

Exception in thread "main" java.lang.NoSuchMethodException: 
    Example.exampleMethod(null) 
     at java.lang.Class.getMethod(Class.java:1605) 
     at Example.main(Example.java:12) 

Ai đó có thể giải thích hành vi này đối với tôi? Cách chính xác để tránh cảnh báo là gì?

Trả lời

36

Tham số thứ hai cho phương thức getMethod là đối số VarArg. Cách sử dụng chính xác là: Nếu phương pháp được phản ánh không có tham số, thì không nên chỉ định tham số thứ hai. Nếu phương pháp phản xạ có tham số, vì vậy mỗi tham số được chỉ định theo cách sau:

import java.lang.reflect.Method; 


public class Example { 

    public void exampleMethodNoParam() { 
     System.out.println("No params"); 
    } 

    public void exampleMethodWithParam(String arg) { 
     System.out.println(arg); 
    } 

    public static void main(String[] args) throws Throwable { 
     Example example = new Example(); 
     Method noParam = Example.class.getMethod("exampleMethodNoParam"); 
     Method stringParam = Example.class.getMethod("exampleMethodWithParam", String.class); 
     noParam.invoke(example); 
     stringParam.invoke(example, "test"); 
     //output 
     //No params 
     //test 
    } 
} 

CẬP NHẬT

Vì vậy, trong trường hợp của bạn, khi bạn chỉ định null trình biên dịch không biết những gì loại nào bạn chỉ định. Khi bạn cố gắng cast null đến một lớp mà chưa được biết rõ nhưng dù sao là một lớp học, bạn sẽ có được một ngoại lệ vì không có

public void exampleMethod(Class<?> object) { }

chữ ký của exampleMethod.

+0

Làm thế nào để một 'null' được đúc khác với một' null' chưa được phát hiện? Tôi không thể thấy điều này trong mã nguồn JDK. – codevour

+0

Hãy nhìn vào bài đăng cập nhật. – StKiller

1

Bạn chưa bỏ null đến Class<?>[], bạn truyền nó đến Class<?>. Vì không có phương thức nào khớp với chữ ký đó, nó sẽ ném ngoại lệ. Chỉnh sửa dàn diễn viên của bạn để xác định đúng mảng.

+0

Thậm chí nếu null đã được đúc vào Class [] Tôi không nghĩ rằng điều này sẽ làm việc ... Sau đó, sự phản ánh sẽ tìm kiếm một phương pháp với lấy một mảng các đối tượng? Mà cũng không tồn tại. – mmccomb

4

Các GetMethod quy định tại java API là:

Method java.lang.Class.getMethod(String name, Class<?>... parameterTypes) 

Nếu phương pháp mà bạn gọi là không có đối số, sau đó bạn nên cung cấp một mảng rỗng hoặc một mảng với chiều dài 0 cho argument.like thứ hai này:

Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]); 

Gọi phương thức bạn cũng nên đặt một mảng trống.

defaultNull.invoke(example , new Object[0]); 
Các vấn đề liên quan