运行时在方法内部获取该方法的名称及参数相关信息

package com.dongjak.scripts.java.反射;

import java.lang.reflect.Method;

import net.sf.json.JSONObject;

import com.dongjak.annotations.LogTarget;

/**
 *
 * @author dongjak
 *
 *
 */
public class 运行时在方法内部获取该方法的名称及参数相关信息 {
    public static void main(String[] args) {
        test2("1");

    }

    public static void test1() {

        help();
    }

    public static void test2(@LogTarget(comment = "ff") String a) {
        help();
    }

    private static String help() {
        /*
         *  在运行时通过获取堆栈信息来提取当前方法所处的类路径及当前方法的名称
         */
        System.out.println(new JSONObject().fromObject(Thread.currentThread()
                .getStackTrace()[2]));
        System.out
                .println(Thread.currentThread().getStackTrace()[2].toString());
        System.out.println("--------------");
        String className = Thread.currentThread().getStackTrace()[2]
                .getClassName();
        String methodName = Thread.currentThread().getStackTrace()[2]
                .getMethodName();
        System.out.println(className);
        System.out.println(methodName);

        /*
         * 但在jvm装载该类的class文件时并不使用"形参"这个概念,形参只是在编码的时候方便程序员记忆的,因此无法通过原生的java api
         * 来获取运行时当前方法的形参名称(仅仅能够知道参数的个数),但可以借助参数注解来存储形参的名称或者其它相关信息,然后再通过
         * 反射来提取这些信息.不过这样感觉就不是那么完美了.
         */
        try {
            Class clazz = Class.forName(className);
            for (Method method : clazz.getMethods()) {
                if (method.getName().equals(methodName)) {
                    System.out.println(method.getParameterAnnotations().length);
                    System.out.println(((LogTarget) method
                            .getParameterAnnotations()[0][0]).comment());
                    // System.out.println(this);
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return className;
    }
}
时间: 2024-08-27 23:29:31

运行时在方法内部获取该方法的名称及参数相关信息的相关文章

C#在运行时动态创建类型的实现方法

本文实例讲述了C#在运行时动态创建类型的实现方法.是C#项目开发中很实用的技巧.分享给大家供大家参考.具体分析如下: 具体来说, C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的 . 主要功能代码如下: public static Assembly NewAssembly() { //创建编译器实例. provider = new CSharpCodeProvider(); //设置编译参数. cp = new CompilerParame

在方法内部获取调用自己方法的“名称”

static void a2() { StackFrame frame = new StackFrame(1); //偏移一个函数位,也即是获取当前函数的前一个调用函数 MethodBase method = frame.GetMethod(); //取得调用函数 Console.WriteLine(method.Name); //a1 } static void a1() { a2(); } 在方法内部获取调用自己方法的"名称"

Spring中的AOP(五)——在Advice方法中获取目标方法的参数

摘要: 本文介绍使用Spring AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数. 获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Ob

维护数字字典时,批量导入数据库的列注释、类型等相关信息

导出的格式形如: use ppdai_vd; go SELECT 'ppdai_vd' AS 数据库名, a.name as '表名' , isnull(e.value,'') as '表注释', CONVERT(VARCHAR(19), a.create_date ,23) AS '创建时间', b.column_id as '字段序号', b.name as '字段名', '数据类型' = case when c.name IN ('varchar','nvarchar','varbinar

Java运行时数据区域(堆 栈 方法区 常量池)

运行时数据区域 (1)程序计数器(program counter register) 一块较小的内存空间 当前线程所执行的字节码的行号指示器,字节码解释器在工作的时候就是通过改变程序计数器的值来选取下一跳要执行的指令 多线程环境下,线程轮流切换执行,程序计数器保证线程切换之后能恢复到正确的位置 每个线程都有一个独立的程序计数器 线程私有 没有任何异常 (2)虚拟机栈(stack) 虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的过程中都会创建一个栈帧,用于存储局部变量表.操作数栈.动

运行时数据区域(堆 栈 方法区 常量池)和内存分配策略

内存管理 内存分配和内存释放 内存分配由程序完成,内存释放由GC完成 运行时数据区域 (1)程序计数器(program counter register) 一块较小的内存空间 当前线程所执行的字节码的行号指示器,字节码解释器在工作的时候就是通过改变程序计数器的值来选取下一跳要执行的指令 多线程环境下,线程轮流切换执行,程序计数器保证线程切换之后能恢复到正确的位置 每个线程都有一个独立的程序计数器 线程私有 没有任何异常 java方法,程序计数器的值为当前正在执行的虚拟机字节码指令的地址 nati

创建Web项目运行时出小错误及解决方法

1.目录结构 2.各文件内容 index.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="/Servlet" method="

Spring中的AOP——在Advice方法中获取目标方法的参数(转)

获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Object getTarget:返回被织入增强处理的目标对象 Object getThis:返回AOP框架为目标对象生成的代理对象 注意:当使

java身份证合法性校验并获取并根据身份证号提取身份证相关信息

/** * 身份证前6位[ABCDEF]为行政区划数字代码(简称数字码)说明(参考<GB/T 2260-2007 中华人民共和国行政区划代码>): * 该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区). * 市(地区,自治州,盟).县(自治县.县级市.旗.自治旗.市辖区.林区.特区). 数字码码位结构从左至右的含义是: 第一层为AB两位代码表示省.自治区.直辖市.特别行政区: 第二层为CD两位代码表示市.地区.自治州.盟.直辖市所辖市