Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to loop over a Class attributes in Java?

How can I loop over a class attributes in java dynamically.

For eg :

public class MyClass{     private type1 att1;     private type2 att2;     ...      public void function(){         for(var in MyClass.Attributes){             System.out.println(var.class);         }     } } 

is this possible in Java?

like image 922
Zakaria Avatar asked Jul 26 '10 10:07

Zakaria


People also ask

Can you loop through a list in Java?

Iterating over a list can also be achieved using a while loop. The block of code inside the loop executes until the condition is true. A loop variable can be used as an index to access each element.


1 Answers

There is no linguistic support to do what you're asking for.

You can reflectively access the members of a type at run-time using reflection (e.g. with Class.getDeclaredFields() to get an array of Field), but depending on what you're trying to do, this may not be the best solution.

See also

  • Java Tutorials: Reflection API / Advanced Language Topics: Reflection

Related questions

  • What is reflection, and why is it useful?
  • Java Reflection: Why is it so bad?
  • How could Reflection not lead to code smells?
  • Dumping a java object’s properties

Example

Here's a simple example to show only some of what reflection is capable of doing.

import java.lang.reflect.*;  public class DumpFields {     public static void main(String[] args) {         inspect(String.class);     }     static <T> void inspect(Class<T> klazz) {         Field[] fields = klazz.getDeclaredFields();         System.out.printf("%d fields:%n", fields.length);         for (Field field : fields) {             System.out.printf("%s %s %s%n",                 Modifier.toString(field.getModifiers()),                 field.getType().getSimpleName(),                 field.getName()             );         }     } } 

The above snippet uses reflection to inspect all the declared fields of class String; it produces the following output:

7 fields: private final char[] value private final int offset private final int count private int hash private static final long serialVersionUID private static final ObjectStreamField[] serialPersistentFields public static final Comparator CASE_INSENSITIVE_ORDER 

Effective Java 2nd Edition, Item 53: Prefer interfaces to reflection

These are excerpts from the book:

Given a Class object, you can obtain Constructor, Method, and Field instances representing the constructors, methods and fields of the class. [They] let you manipulate their underlying counterparts reflectively. This power, however, comes at a price:

  • You lose all the benefits of compile-time checking.
  • The code required to perform reflective access is clumsy and verbose.
  • Performance suffers.

As a rule, objects should not be accessed reflectively in normal applications at runtime.

There are a few sophisticated applications that require reflection. Examples include [...omitted on purpose...] If you have any doubts as to whether your application falls into one of these categories, it probably doesn't.

like image 193
polygenelubricants Avatar answered Sep 21 '22 00:09

polygenelubricants