2008-11-07 23 views
6

Tôi có một câu hỏi đơn giản. Có cách nào (bằng cách sử dụng phản xạ tôi giả sử) để lặp lại tất cả các giá trị tĩnh của một lớp học?lặp lại giá trị int tĩnh trong java

Ví dụ

class Any { 
    static int one = 1; 
    static int two = 2; 
    static int three = 3; 

    public static void main(String [] args) { 
      for(int i : magicMethod(Any.class)){ 
       System.out.println(i); 
      } 
    } 
} 

Output

1 
2 
3 

Cảm ơn.

+1

quá nhiều câu hỏi tìm kiếm như bài tập về nhà ... –

Trả lời

15
import java.util.*; 
import java.lang.reflect.*; 

class Any { 
    static int one = 1; 
    static int two = 2; 
    static int three = 3; 

    public static void main(String [] args) { 
      for(int i : magicMethod(Any.class)){ 
       System.out.println(i); 
      } 
    } 

    public static Integer[] magicMethod(Class<Any> c) { 
     List<Integer> list = new ArrayList<Integer>(); 
     Field[] fields = c.getDeclaredFields(); 
     for (Field field : fields) { 
      try { 
       if (field.getType().equals(int.class) && Modifier.isStatic(field.getModifiers())) { 
        list.add(field.getInt(null)); 
       } 
      } 
      catch (IllegalAccessException e) { 
       // Handle exception here 
      } 
     } 
     return list.toArray(new Integer[list.size()]); 
    } 
} 
4

Hey .. nó rất dễ dàng. : P

 Field [] constants = Main.class.getFields(); 
     Object some = new Main(); 
     for(Field field : constants){ 
      if(Modifier.isStatic(field.getModifiers()) && 
      field.getType() == int.class ) { 
        System.out.println(field.getInt(some )); 
      } 
     } 
1

Bạn có thể làm một cái gì đó như thế này:

import java.lang.reflect.*; 

public class Foo { 

public static int one = 1; 
public static int two = 2; 
public static int three = 3; 

public static void magicMethod(Class clz) throws Exception { 
    Field[] fields = clz.getFields(); 
    System.out.println(""+fields); 
    for(Field field : fields) { 
     int modifiers = field.getModifiers(); 
     if(! Modifier.isStatic(modifiers)) 
      continue; 
     System.out.println("" + field.get(null)); 
    } 
} 

public static void main(String[] args) throws Exception { 
    Foo.magicMethod(Foo.class); 
}} 

Điều quan trọng cần lưu ý, tuy nhiên, các lĩnh vực phải được công khai để làm việc này. Nó không chính xác những gì bạn hỏi, nhưng nó phải đủ gần mà bạn sẽ có thể làm cho nó làm việc cho những gì bạn cần. Rõ ràng điều này không làm bất kỳ loại xử lý lỗi hoặc bất cứ điều gì vì vậy bạn nên chắc chắn rằng bạn xử lý bất kỳ lỗi hoặc ngoại lệ trong ứng dụng thực sự của bạn.

2

Giải pháp của bạn hoạt động cho các trường công khai nhưng không hoạt động ở các trường riêng tư như bạn có trong ví dụ của mình. Nếu bạn muốn có thể truy cập vào các trường riêng của một lớp, bạn cần sử dụng getDeclaredFields() thay vì getFields().

+0

Tuyệt vời .. thông tin tốt ... – OscarRyz

0

Là một thay thế, sử dụng một enum và thoát khỏi các biến lớp học hoàn toàn (để được chính xác, enum là một biến lớp cũng :-)):

class Any { 
    enum Number { 
     ONE(1), 
     TWO(2), 
     THREE(3); 

     Number(int number) { 
      this.number = number; 
     } 

     int number; 
    }; 

    public static void main(String [] args) { 
     for (Number value : Number.values()) { 
      System.out.println(value.number); 
     } 
    } 
} 
Các vấn đề liên quan