2010-05-19 32 views
11

về cơ bản tôi cần phải có được một hằng số cho một lớp tuy nhiên tôi không có thể hiện của đối tượng mà chỉ có lớp của nó. Trong PHP, tôi sẽ làm constant(XYZ); Có cách nào tương tự để truy xuất hằng số trong JAVA không?làm thế nào để có được một hằng số trong java với lớp

tôi cần nó để tạo điều kiện gọi GetMethod động

Class parameterType = Class.forName(class_name); 
object.setProperty(field name, field value, parameterType); 

phương pháp hữu bộ sau đó sẽ nhận được phương pháp đúng đắn và thiết lập thuộc tính nhất định, tuy nhiên tôi không thể có được một phương pháp trong đó có int as type tham số mà không sử dụng Interger.TYPE

Trả lời

0

Tôi không chắc chắn những gì bạn muốn thoát ra. Nhưng nó không quá khó để chỉ cho bạn một ví dụ.

Cho phép nói rằng bạn có Class Foo với thanh thuộc tính.

Class Foo { 
    private final String bar = "test"; 
    public String getBar() {return bar;} 
} 

Bây giờ để có được điều này thông qua phản ánh bạn sẽ:

Class fooClass = Foo.class; 
Object fooObj = fooClass.newInstance(); 
Method fooMethod = fooClass.getMethod("getBar"); 
String bar = (String) fooMethod.invoke(fooObj); 

Bây giờ bạn sẽ nhận được giá trị của phương pháp getBar() trong biến thanh

2

Nếu đây liên tục là siêu dữ liệu về lớp, tôi 'd thực hiện việc này với annotations:

Bước đầu tiên, khai báo chú thích:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@interface Abc { 
    String value(); 
} 

Bước hai, chú thích lớp học của bạn:

@Abc("Hello, annotations!") 
class Zomg { 

} 

Bước ba, lấy giá trị:

String className = "com.example.Zomg"; 
Class<?> klass = Class.forName(className); 
Abc annotation = klass.getAnnotation(Abc.class); 
String abcValue = annotation.value(); 
System.out.printf("Abc annotation value for class %s: %s%n", className, abcValue); 

Output là:

Abc annotation value: Hello, annotations!
0

Có lẽ tôi không hiểu những gì bạn cần, nhưng bạn đã thử với các thuộc tính tĩnh cuối cùng và các phương thức tĩnh?

Cuối cùng có nghĩa là nó không thể thay đổi sau khi được đặt, vì vậy bạn nhận được một hằng số. Tĩnh nghĩa là có thể truy cập được ngay cả khi không có bất kỳ đối tượng nào của lớp.

28

Bạn có thể tìm kiếm sth. như
Foo.class.getDeclaredField("THIS_IS_MY_CONST").get(null); hoặc Class.forName("Foo").getDeclaredField("THIS_IS_MY_CONST").get(null); (nhờ f-o-o)

Gets giá trị của một chuỗi liên tục (THIS_IS_MY_CONST) trong lớp Foo.

Cập nhật sử dụng null như là đối số cho get nhờ acdcjunior

+1

Lưu ý rằng 'tranh luận String.class' truyền cho' Dòng # get (Object) 'phương pháp là tranh luận cho các lĩnh vực tĩnh - theo javadoc: > Nếu trường cơ bản là một trường tĩnh, đối số obj bị bỏ qua; nó có thể là null. Vì vậy, đối số không ngụ ý rằng giá trị trường sẽ là một Chuỗi và có thể là rỗng. – superEb

+4

Vì nó là trường 'tĩnh',' Foo.class.getDeclaredField ("MY_CONST"). Nhận (null); 'là cách thích hợp để lấy giá trị của nó. (Đối số 'String.class' trong câu trả lời bị bỏ qua và thực sự gây hiểu lầm.) – acdcjunior

+0

Nếu bạn không biết Foo là gì? Tôi nghĩ Class.forName ("Foo") sẽ lý tưởng hơn. –

Các vấn đề liên quan