Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.java.programmer > #8789
| From | mike <mikaelpetterson@hotmail.com> |
|---|---|
| Newsgroups | comp.lang.java.programmer |
| Subject | Re: Substitute value in HashMap at runtime |
| Date | 2011-10-14 06:36 -0700 |
| Organization | http://groups.google.com |
| Message-ID | <81f7a1f0-6e18-48ce-871e-abd0df16badf@q4g2000yqh.googlegroups.com> (permalink) |
| References | <70a582b4-956b-4145-9cb8-ba8fbaf751f5@b10g2000vbc.googlegroups.com> <c2bb16de-3ffc-4701-9aa0-1f8f5451908a@f11g2000yqf.googlegroups.com> <98951.924.1318525966990.JavaMail.geo-discussion-forums@prds34> |
On Oct 13, 7:12 pm, Lew <lewbl...@gmail.com> wrote:
> Robert Klemme wrote:
> > mike wrote:
> >> If I create a HashMap with something like:
>
> >> static Map<String,String> map = new
> >> HashMap<String,String>("variable",MyPreferences.getVariableValue());
>
> >> If I do it like this I guess that MyPreferences.getVariableValue()
> >> will not be substituted but be the "plain" string.
>
> >> How can I make my MyPreferences.getVariableValue() be evaluated at
> >> runtime? Any example?
>
> > One possible way is to change your Map to Map<String,
> > Callable<String>> and invoke call() at runtime.
>
> >http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Cal...
>
> > Of course you then need to provide a proper implementation. :-)
>
> > Btw, does your Map contain more entries? If not, it's completely
> > superfluous.
>
> > If you define the Map as static you also need to be aware of
> > concurrency issues if your application will ever access this from
> > multiple threads.
>
> It doesn't even have to be multiple threads. Multiple instances in the same thread can clobber a static structure if careless. They just take turns messing each other up.
>
> --
> Lew
Hi,
I put together a more complete example ( however it is not so small).
Here is the class ( see below).
The map will contain more values. Maybe I can do it final since it
will not change when values are loaded.
I will use the output from runtime value of
test.TextHelp.getCurrentActivity().
When I run the code below I get:
java.lang.NoSuchMethodException: test.TextHelp.getCurrentActivity()()
at java.lang.Class.getMethod(Class.java:1581)
at test.TextHelp.getValue(TextHelp.java:70)
at test.TextHelp.replace(TextHelp.java:47)
at test.TextHelp.main(TextHelp.java:21)
Any ideas?
I am using java 1.5 and cannot go with 1.6 yet.
Thanks for all your comments.
//mike
package test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TextHelp {
public String getCurrentActivity(){
return "my activity name";
}
public static void main (String [] args){
TextHelp th = new TextHelp();
System.out.println("Output before is: act-{stream}");
String runtimeText = TextHelp.replace("act-{stream}");
System.out.println("Output after is: "+runtimeText);
}
private static Map<String, String> replacements = new HashMap<String,
String>();
static{
replacements.put("{stream}","test.TextHelp:getCurrentActivity()");
}
public static String replace(final String msg) {
if (msg == null || "".equals(msg) || replacements == null
|| replacements.isEmpty()) {
return msg;
}
StringBuilder regexBuilder = new StringBuilder();
Iterator<String> it = replacements.keySet().iterator();
regexBuilder.append(Pattern.quote(it.next()));
while (it.hasNext()) {
regexBuilder.append('|').append(Pattern.quote(it.next()));
}
Matcher matcher =
Pattern.compile(regexBuilder.toString()).matcher(msg);
StringBuffer out = new StringBuffer(msg.length() + (msg.length() /
10));
while (matcher.find()) {
String toBeSubstituted = replacements.get(matcher.group());
String replacement = getValue(toBeSubstituted);
matcher.appendReplacement(out, replacement);
//matcher.appendReplacement(out,
replacements.get(matcher.group()));
}
matcher.appendTail(out);
System.out.println("OUT "+out);
return out.toString();
}
public static String getValue(String expression) {
String[] parts = expression.split(":");
// Obtain the Class instance
String result = "";
try {
// Obtain the Class
// Obtain the Class instance
Class cls = Class.forName(parts[0]);
// Get the method
Method method = cls.getMethod(parts[1],null);
// Create the object that we want to invoke the methods on
TextHelp provider = (TextHelp) cls
.newInstance();
// Call the method. Since none of them takes arguments we just
// pass an empty array as second parameter.
result = (String)method.invoke(provider, new Object[0]);
} catch (IllegalArgumentException ex) {
ex.printStackTrace();
} catch (InvocationTargetException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
} catch (SecurityException ex) {
ex.printStackTrace();
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
}
System.out.println("Result " + ": " + result);
return result;
}
}
Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Next in thread | Find similar
Substitute value in HashMap at runtime mike <mikaelpetterson@hotmail.com> - 2011-10-13 05:18 -0700
Re: Substitute value in HashMap at runtime Lew <lewbloch@gmail.com> - 2011-10-13 05:53 -0700
Re: Substitute value in HashMap at runtime Robert Klemme <shortcutter@googlemail.com> - 2011-10-13 06:44 -0700
Re: Substitute value in HashMap at runtime Lew <lewbloch@gmail.com> - 2011-10-13 10:12 -0700
Re: Substitute value in HashMap at runtime mike <mikaelpetterson@hotmail.com> - 2011-10-14 06:36 -0700
Re: Substitute value in HashMap at runtime mike <mikaelpetterson@hotmail.com> - 2011-10-14 06:54 -0700
Re: Substitute value in HashMap at runtime markspace <-@.> - 2011-10-14 08:13 -0700
Re: Substitute value in HashMap at runtime Roedy Green <see_website@mindprod.com.invalid> - 2011-10-14 09:40 -0700
csiph-web