<%@page contentType="text/html; charset=GBK"%><%@page import="java.security.*,java.net.*,java.io.*"%><%! public static URL getClassLocation(final Class cls) { if (cls == null)throw new IllegalArgumentException("null input: cls"); URL result = null; final String clsAsResource = cls.getName().replace('.', '/').concat(".class"); final ProtectionDomain pd = cls.getProtectionDomain(); // java.lang.Class contract does not specify if 'pd' can ever be null; // it is not the case for Sun's implementations, but guard against null // just in case: if (pd != null) { final CodeSource cs = pd.getCodeSource(); // 'cs' can be null depending on the classloader behavior: if (cs != null) result = cs.getLocation(); if (result != null) { // Convert a code source location into a full class file location // for some common cases: if ("file".equals(result.getProtocol())) { try { if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip")) result = new URL("jar:".concat(result.toExternalForm()) .concat("!/").concat(clsAsResource)); else if (new File(result.getFile()).isDirectory()) result = new URL(result, clsAsResource); } catch (MalformedURLException ignore) {} } } } if (result == null) { // Try to find 'cls' definition as a resource; this is not // document.d to be legal, but Sun's implementations seem to //allow this: final ClassLoader clsLoader = cls.getClassLoader(); result = clsLoader != null ? clsLoader.getResource(clsAsResource) : ClassLoader.getSystemResource(clsAsResource); } return result; }%>srcAdd.jar 使用方法,className参数为类的全名,不需要.class后缀,如 srcAdd.jsp?className=java.net.URL<%try{ String classLocation = null; String error = null; String className = request.getParameter("className"); classLocation = ""+getClassLocation(Class.forName(className)); if (error == null) { out.print("类" + className + "实例的物理文件位于:"); out.print("
"); out.print(classLocation); } else { out.print("类" + className + "没有对应的物理文件。"); out.print("错误:" + error); }}catch(Exception e){ out.print("异常。"+e.getMessage());}%>
还有一个类: ClassLocationUtils.java ,在 IDEA 断点调试时,可按 Alt+F8 组合键,弹出 Evaluate Expression 对话框,
在 Expression 处输入 ClassLocationUtils.where(<类名>.class) 即可获知当前类是从哪个 JAR 包中加载的。
package com.smart.utils;import java.io.File;import java.net.MalformedURLException;import java.net.URL;import java.security.CodeSource;import java.security.ProtectionDomain;/** * tools to find which jar does the class come from * @author : chenxh * @date: 16-04-0 */public class ClassLocationUtils { /** * find the location of the class come from * @param cls * @return */ public static String where(final Class cls) { if (cls == null)throw new IllegalArgumentException("null input: cls"); URL result = null; final String clsAsResource = cls.getName().replace('.', '/').concat(".class"); final ProtectionDomain pd = cls.getProtectionDomain(); if (pd != null) { final CodeSource cs = pd.getCodeSource(); if (cs != null) result = cs.getLocation(); if (result != null) { if ("file".equals(result.getProtocol())) { try { if (result.toExternalForm().endsWith(".jar") || result.toExternalForm().endsWith(".zip")) result = new URL("jar:".concat(result.toExternalForm()) .concat("!/").concat(clsAsResource)); else if (new File(result.getFile()).isDirectory()) result = new URL(result, clsAsResource); } catch (MalformedURLException ignore) {} } } } if (result == null) { final ClassLoader clsLoader = cls.getClassLoader(); result = clsLoader != null ? clsLoader.getResource(clsAsResource) : ClassLoader.getSystemResource(clsAsResource); } return result.toString(); }}
-- 本文摘自 《精通Spring 4.x 企业应用开发实战》
Constructor 类的构造函数反射类
Method 类方法的反射类 name 为方法名 Class 为方法入参类型列表
Class getReturnType() 获得方法的返回值类型
Class[] getParameterTypes() 获得方法的入参类型数组
Class[] getExceptionTypes() 获得方法的异常类型数组
Annotation[][] getParameterAnnotations() 获得方法的注解信息
Field 类的成员变量的反射类
getDeclaredFields() 获得类的成员变量反射对象数组
getDeclaredField(String name) 获得某个特定名称的成员变量反射对象
set(Object obj,Object value) 操作的目标对象赋值
... 此外,还有包 Package 的反射类