2015-06-25 2 views
0

я есть пример простой код:Java - как избавиться от примитивного типа и получить неиспользуемого локальной переменной

class Test { 
    void method(boolean boo){ 
     String b; 
     int a=0; 
     try 
     { 
      java.awt.image.BufferedImage image=null; 
      new Thread().sleep(1000); 
      javax.swing.JOptionPane.showMessageDialog(null,"test"); 
      java.io.File file=new java.io.File("C:\\file.png"); 
      boolean boo=file.exists(); 
      if(boo==true) 
       image=javax.imageio.ImageIO.read(file); 
     } 
     catch(InterruptedException e){} 
    } 
} 

В основном я должен использовать BCEL для доступа байт-код и достичь своей цели. так, у меня есть попытаться создать простой код:

import org.apache.bcel.Repository; 
import org.apache.bcel.classfile.*; 

class javap 
{ 
    public static void main(String[]args) 
    { 
     try 
     { 
      JavaClass jc = Repository.lookupClass("Test"); 
      ConstantPool constantPool = jc.getConstantPool(); 
      Method [] method=jc.getMethods(); 
      for (Method m : method) 
      { 
       LocalVariableTable lvt=m.getLocalVariableTable(); 
       LocalVariable[] lv=lvt.getLocalVariableTable(); 
       for(LocalVariable l : lv) 
       { 
        System.out.println(l.getName()+" : "+l.getSignature()); 
       } 
      } 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 
    } 
} 

Результат:

local variable : this --> LTest; 
local variable : image --> Ljava/awt/image/BufferedImage; 
local variable : file --> Ljava/io/File; 
local variable : boo --> Z 
local variable : ex --> Ljava/lang/Exception; 
local variable : this --> LTest; 
local variable : a --> I 

Как устранить примитивные типы, которые были извлекаемые как a как int и boo в boolean, и как получить неиспользованные местные переменная как String b?

-Thanks-

+0

Этот 'catch' в' Test' ничего не бросает ... sigh –

+0

rakeb.void: учитывая содержимое блока try, я думаю, что здесь можно упустить это. новичок: вы можете использовать классы Wrapper, чтобы избавиться от примитивов, а строка с помощью b вы можете просто удалить или прокомментировать. Таким образом, ваш код (где у вас есть две переменные с именем b) может стать компилируемым. Мне кажется, вы не знаете соглашения об именах и имеете довольно грязный код. Возможно, вам лучше всего изучить основы, прежде чем запускать более сложный код. – Stultuske

+0

@Stultuske, OP не просил советов по оптимизации теста. он/она запрашивал советы по использованию библиотеки BCEL. Я считаю, что код в тесте бесполезен по назначению, и любой, кто разбирает байт-код, вряд ли новичок –

ответ

1

Что касается поиска неиспользуемых локальных переменный: Я побежал ваш код и я вижу, что LocalVariableTable, кажется, не содержит unsued String. Когда я «использую» его, инициализируя его, переменная будет добавлена ​​в таблицу. Я искал и в соответствии с this thread JIT (или, возможно, компилятор? Поскольку он является создателем байт-кода) оптимизирует код и полностью удаляет unsued var из байт-кода.

+0

как устранить примитивный тип ??? – newbie

+0

Что вы подразумеваете под «устранением», хотите ли вы обнаружить примитивные типы в «LocalVariableTable» или изменить байт-код и удалить переменную? –

+0

Из результата я хочу не показывать «boo» и «a», потому что оба они примитивны. – newbie

Смежные вопросы