1 16 17 package com.google.inject.util; 18 19 import com.google.inject.spi.SourceProviders; 20 import static com.google.inject.util.ReferenceType.SOFT; 21 import static com.google.inject.util.ReferenceType.WEAK; 22 import java.io.IOException ; 23 import java.lang.reflect.Constructor ; 24 import java.lang.reflect.Member ; 25 import java.util.Map ; 26 27 32 public class StackTraceElements { 33 34 static final Map <Class <?>, LineNumbers> lineNumbersCache 35 = new ReferenceCache<Class <?>, LineNumbers>(WEAK, SOFT) { 36 protected LineNumbers create(Class <?> key) { 37 try { 38 return new LineNumbers(key); 39 } 40 catch (IOException e) { 41 throw new RuntimeException (e); 42 } 43 } 44 }; 45 46 public static Object forMember(Member member) { 47 if (member == null) { 48 return SourceProviders.UNKNOWN_SOURCE; 49 } 50 51 Class declaringClass = member.getDeclaringClass(); 52 LineNumbers lineNumbers = lineNumbersCache.get(declaringClass); 53 Integer lineNumber = lineNumbers.getLineNumber(member); 54 String memberName 55 = member instanceof Constructor ? "<init>" : member.getName(); 56 StackTraceElement element = new StackTraceElement ( 57 declaringClass.getName(), memberName, lineNumbers.getSource(), 58 lineNumber == null ? lineNumbers.getFirstLine() : lineNumber); 59 return element; 60 } 61 62 public static Object forType(Class <?> implementation) { 63 LineNumbers lineNumbers = lineNumbersCache.get(implementation); 64 return new StackTraceElement ( 65 implementation.getName(), 66 "class", 67 lineNumbers.getSource(), 68 lineNumbers.getFirstLine()); 69 } 70 } 71 | Popular Tags |