user1573029
user1573029

Reputation: 107

How to add attributes Dynamically for java object?

Having Student Class.

Class Student{
    String _name;
    ....
    ....

    public Student(){
    }
}

is there any possibility to add dynamic attributes to Student Object? without extending the student class.

Upvotes: 9

Views: 52414

Answers (3)

FThompson
FThompson

Reputation: 28687

In short, yes it is possible to modify bytecode at runtime, but it can be extremely messy and it (most likely) isn't the approach you want. However, if you decide to take this approach, I recommend a byte code manipulation library such as ASM.

The better approach would be to use a Map<String, String> for "dynamic" getters and setters, and a Map<String, Callable<Object>> for anything that isn't a getter or setter. Yet, the best approach may be to reconsider why you need dynamic classes altogether.

public class Student {

    private Map<String, String> properties = new HashMap<String, String>();
    private Map<String, Callable<Object>> callables = new HashMap<String, Callable<Object>>();
    ....
    ....
    public String getProperty(String key) {
        return properties.get(key);
    }

    public void setProperty(String key, String value) {
        properties.put(key, value);
    }

    public Object call(String key) {
        Callable<Object> callable = callables.get(key);
        if (callable != null) {
            return callable.call();
        }
        return null;
    }

    public void define(String key, Callable<Object> callable) {
        callables.put(key, callable);
    }
}

As a note, you can define void methods with this concept by using Callable and returning null in it.

Upvotes: 20

Rohit Jain
Rohit Jain

Reputation: 213193

Although you can do that with some tricky, and complex way that others have suggested..

But you can sure have your attributes in some data structure(An appropriate one will be a Map).. Since you can modify your existing attributes, so can be done with you Data Structure. You can add more attributes to them.. This will be a better approach..

Upvotes: 0

Jim Garrison
Jim Garrison

Reputation: 86754

You could get into bytecode manipulation but that way madness lies (especially for the programmer who has to maintain the code).

Store attributes in a Map<String,String> instead.

Upvotes: 8

Related Questions