![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@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; } %> <html> <head> <title>srcAdd.jar</title> </head> <body bgcolor="#ffffff"> 使用方法,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("<hr>"); out.print(classLocation); } else { out.print("类" + className + "没有对应的物理文件。<br>"); out.print("错误:" + error); } }catch(Exception e) { out.print("异常。"+e.getMessage()); } %> </body> </html>
还有一个类: ClassLocationUtils.java ,在 IDEA 断点调试时,可按 Alt+F8 组合键,弹出 Evaluate Expression 对话框,
在 Expression 处输入 ClassLocationUtils.where(<类名>.class) 即可获知当前类是从哪个 JAR 包中加载的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 的反射类
![](https://images2017.cnblogs.com/blog/551042/201708/551042-20170825171749277-317114775.png)