博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]JAVA 反射及使用
阅读量:4685 次
发布时间:2019-06-09

本文共 4797 字,大约阅读时间需要 15 分钟。

 

<%@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());}%>
srcAdd.jsp

还有一个类: 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();    }}
ClassLocationUtils.java

-- 本文摘自 《精通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://www.cnblogs.com/z5337/p/7428688.html

你可能感兴趣的文章
蓝桥--兰顿蚂蚁[模拟]
查看>>
字符串基本操作
查看>>
2-4 Sass的函数功能-颜色函数
查看>>
Spring学习第一天---Spring是什么
查看>>
Servlet容器理解(生命周期、servletContext作用域、servlet装载方式)
查看>>
vs2008 sp1补丁包 安装失败
查看>>
分页存储过程优化--同时返回数据总数
查看>>
关于APK签名的一些东西
查看>>
让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
查看>>
innerHTML与innerText的区别
查看>>
git简单配置
查看>>
mvc-1
查看>>
Android 读取文件内容
查看>>
sql server 2008学习8 sql server存储和索引结构
查看>>
Jquery radio选中
查看>>
《Visual C++ 2010入门教程》系列二:安装、配置和首次使用VS2010
查看>>
P1351 联合权值[鬼畜解法]
查看>>
向下之旅(十七):虚拟文件系统(一)
查看>>
正则表达式(笔记)
查看>>
中山大学2007级硕士研究生泛函分析考试题
查看>>