• [转]JAVA 反射及使用


     

    <%@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>
    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 的反射类

     

  • 相关阅读:
    flask 返回json数据
    flask 中文乱码
    flask 参数校验
    AOP集成防止连续多次点击问题
    关于横竖屏切换导致的Activity重建问题
    Flutter工程无法找到Android真机或Android模拟器
    Failed to find configured root that contains
    Unable to resolve dependency问题解决
    双重ScrollView,RecyclerView联动实例
    RecyclerView联动滑动失败
  • 原文地址:https://www.cnblogs.com/z5337/p/7428688.html
Copyright © 2020-2023  润新知