Java知识集锦
常见名词
名词术语 | 说明 |
JPA | Java关于ORM的标准,Hibernate实现了该标准 |
JTA | Java关于事务的API |
JDI | Java 调试接口(Java Debug Interface) |
JDT | Java 开发工具(Java Development Tools) |
JDWP | Java 调试网络协议(Java Debug Wire Protocol),描述调试信息的格式 |
JPDA | Java 平台调试器架构(Java Platform Debugger Architecture) |
JVMTI | JVM 工具接口(JVM Tool Interface) |
JVMDI | JVM 调试接口(JVM Debug Interface) |
常用代码片段
获取当前调用栈
JDK 1.4,可以通过 Throwable.getStackTrace方法得到,效率较低
JDK 1.5或者更高,使用
Thread.currentThread.getStackTrace 得到
获取泛型类的参数化类型
接口 Type 表示一个抽象的类型, java.lang.Class 实现了此接口。但是并非Type类型的实例均为Class,例如ParameterizedTypeImpl就不是。
接口 ParameterizedType 用来表示一个特化后的参数化类型,该接口有以下重要的实例方法:
- getActualTypeArguments() :可以得到一个Type类型的数组,这些数组的元素为参数化类型的全部实际类型参数。注意这些数组元素本身也可以是ParameterizedType
- getRawType :可以获得此参数化类型的原生类型,即除去泛型声明后的部分
实现泛型接口的情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Object action = invocation.getAction(); if ( action instanceof ModelDriven ) { // 获得接口列表 Type[] intfs = action.getClass().getGenericInterfaces(); for ( Type t : intfs ) { if ( t instanceof ParameterizedType ) { // 参数化后、action所属类实现的接口 ParameterizedType pt = (ParameterizedType) t; // 接口的原始类型 Type rawType = pt.getRawType(); if ( ModelDriven.class.equals( rawType ) ) { //这个原始类型的实际类型就是一个Class对象 // Class实现了Type接口 Type modelType = pt.getActualTypeArguments()[0]; if ( modelType instanceof Class ) { ctx.put( "entityType", ( (Class) modelType ).getSimpleName() ); break; } } } } } |
衍生泛型类的情况
这个处理起来比较简单,因为Java只允许单继承:
1 2 3 4 5 6 |
Type t = c.getGenericSuperclass(); if ( t instanceof ParameterizedType ) { Type[] p = ( (ParameterizedType) t ).getActualTypeArguments(); // ... } |
运行时增加Classpath
1 2 3 4 5 6 7 8 9 10 11 |
java.io.File dir = new java.io.File( "D:/Temp/" ); Class c = java.net.URLClassLoader.class; java.lang.reflect.Method method = c.getDeclaredMethod( "addURL", new Class[] { java.net.URL.class } ); method.setAccessible( true ); for ( java.io.File f : dir.listFiles() ) { if ( f.getName().endsWith( ".jar" ) ) { method.invoke( (java.net.URLClassLoader) ClassLoader.getSystemClassLoader(), new Object[] { f.toURI().toURL() } ); } } |
运行时修改本地库路径
即修改系统属性java.library.path,参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public static void addLibraryPath( String path ) throws Exception { final Field sysPathsField = ClassLoader.class.getDeclaredField( "sys_paths" ); sysPathsField.setAccessible( true ); final String[] paths = (String[]) sysPathsField.get( null ); for ( String p : paths ) { if ( p.equals( path ) ) return; } final String[] newPaths = new String[paths.length + 1]; System.arraycopy( paths, 0, newPaths, 0, paths.length ); newPaths[newPaths.length - 1] = path; String join = StringUtils.join( newPaths, SystemUtils.IS_OS_WINDOWS ? ";" : ":" ); System.setProperty( "java.library.path", join ); sysPathsField.set( null, null ); } |
执行JS语法分析
Rhino是一个开源的、纯Java编写的JavaScript引擎,已经嵌入到JavaSE 6,作为默认的JS脚本引擎。
使用该框架可以对JavaScript表达式进行解析,Rhino 1.7版本引入了新的AST(抽象语法树)接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import org.mozilla.javascript.Parser; import org.mozilla.javascript.ast.AstNode; import org.mozilla.javascript.ast.Name; import org.mozilla.javascript.ast.NodeVisitor; //下面的代码可以得到表达式中的所有“名称”:包括变量、方法、属性、函数 final String script = "DZXY.substr(MLL,Math.random(SZL,Ei))"; AstNode node = new Parser().parse( script, null, 1 ); node.visit( new NodeVisitor() { @Override public boolean visit( AstNode node ) { if ( node instanceof Name ) { Name nn = (Name) node; String name = nn.getString(); int pos = nn.getAbsolutePosition(); //根据name、pos结合字符串处理,可以区分出变量、属性、函数调用 } return true; } } ); |
常见问题
零散问题
格式化为XML标准时间格式yyyy-MM-ddTHH:mm:ss时报错
报错:Illegal pattern component: T
解决:使用单引号把T包含起来:yyyy-MM-dd'T'HH:mm:ss
Axis知识集锦 →
Leave a Reply