Статические методы являются просто методами, они не хранятся на "куче", они просто не добираются для использования "этого" параметра.
Статические переменные служат "корнями" к GC. В результате, если Вы явно не устанавливаете их в NULL, они будут жить пока жизни программы и так являются всем достижимым от них.
ситуацию с А только считают утечкой памяти, если Вы предназначаете, чтобы память стала свободной, и это не становится свободным. Если Вы предназначаете, чтобы Ваша статическая переменная содержала ссылку на объект для части времени, и Вы забываете устанавливать его в NULL, когда Вы сделаны с тем объектом, Вы, вероятно, закончили бы с утечкой. Однако, если Вы помещаете его в статическую переменную и предназначаете, чтобы это было там столько, сколько программа работает, тогда это - совершенно определенно не утечка, это более вероятно "постоянный одиночный элемент". Если объект был исправлен, в то время как Вы хотели, чтобы он все еще существовал, который будет очень плох.
Что касается Вашего вопроса о "куче": Все объекты в Java существуют или на "куче" или на стеке. Объекты создаются на "куче" с новым оператором. Ссылка тогда присоединена к ним. Если ссылка становится пустой или падает из объема (например, конец блока), GC понимает, что нет никакого способа достигнуть того объекта когда-либо снова и не исправляет его. Если Ваша ссылка находится в статической переменной, она никогда не падает из объема, но можно все еще установить ее в NULL или к другому объекту.
Вы можете использовать регулярное выражение, чтобы выудить такую информацию.
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group(1));
}
В этом примере предполагается, что язык анализируемой строки не поддерживает escape-последовательности для двойных кавычек в строковых литералах, содержит строки, охватывающие несколько «строк», или поддерживает другие разделители для строк, такие как одинарные кавычки.
String line = "if(getip(document.referrer)==\"www.eg.com\" || getip(document.referrer)==\"192.57.42.11\"";
StringTokenizer stk = new StringTokenizer(line, "\"");
stk.nextToken();
String egStr = stk.nextToken();
stk.nextToken();
String ipStr = stk.nextToken();
Если вы анализируете весь исходный файл, а не только одну строку, анализатор, основанный на грамматике функции, может быть более безопасным выбором, чем попытки сделать это на основе строк.
Я предполагаю, что в вашей грамматике это будут строковые литералы.
Проверьте StringUtils
в библиотеке Apache commons-lang - у него есть метод substringsBetween
.
String lineOfText = "if(getip(document.referrer)==\"www.eg.com\" || getip(document.referrer)==\"192.57.42.11\"";
String[] valuesInQuotes = StringUtils.substringsBetween(lineOfText , "\"", "\"");
assertThat(valuesInQuotes[0], is("www.eg.com"));
assertThat(valuesInQuotes[1], is("192.57.42.11"));
Во-первых, обратите внимание, что вам следует использовать equals (), а не ==. «==» по умолчанию спрашивает, являются ли они одним и тем же экземпляром в памяти, что иногда бывает в строках. С myString.equals ("...") вы сравниваете значения строк.
Что касается того, как получить значения между кавычками, я не уверен, что вы имеете в виду. «...» - это реальный объект. В качестве альтернативы вы можете сделать:
String webUrl = "www.eg.com";