获取调用者Class和method、反射获取get方法、获取注解信息

调用者Class 及 method

StackTraceElement stacks[] = Thread.currentThread().getStackTrace();
        for (StackTraceElement stack : stacks) {
            String className = stack.getClassName();
            if (className.contains("com.upsoft")
                    && className.contains("Controller")) {
                className = className.substring(className.lastIndexOf(".") + 1,
                        className.length());
                String methodName = stack.getMethodName();
            }
        }

反射(get)

// 通过反射 遍历实体所有属性,找出发生改变的字段及修改前和修改后的值
        Field[] fields = entity.getClass().getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {

            changeColumn = new ColumnChangeBean();
            String attrName = fields[i].getName();
            Class<?> attrType = fields[i].getType();
            Method method = getGetMethod(entity.getClass(), attrName);

            try {

                Object oldValue = null;
                Object newValue = null;

                // 通过反射获取 oldValue 和 newValue 的值
                if (oldEntity != null) {
                    oldValue = method.invoke(oldEntity, new Object[0]);
                }
                newValue = method.invoke(entity, new Object[0]);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    private Method getGetMethod(Class objectClass, String fieldName) {
        StringBuffer sb = new StringBuffer();
        sb.append("get");
        sb.append(fieldName.substring(0, 1).toUpperCase());
        sb.append(fieldName.substring(1));
        try {
            return objectClass.getMethod(sb.toString());
        } catch (Exception e) {
        }
        return null;
    }

反射(set)

public static void invokeSet(Object o, String fieldName, Object value) {       

    Method method = getSetMethod(o.getClass(), fieldName);       

    try {       

        method.invoke(o, new Object[] { value });       

    } catch (Exception e) {       

        e.printStackTrace();       

    }       

}

public static Method getSetMethod(Class objectClass, String fieldName) {       

    try {       

        Class[] parameterTypes = new Class[1];       

        Field field = objectClass.getDeclaredField(fieldName);       

        parameterTypes[0] = field.getType();       

        StringBuffer sb = new StringBuffer();       

        sb.append("set");       

        sb.append(fieldName.substring(0, 1).toUpperCase());       

        sb.append(fieldName.substring(1));       

        Method method = objectClass.getMethod(sb.toString(), parameterTypes);       

        return method;       

    } catch (Exception e) {       

        e.printStackTrace();       

    }       

    return null;       

} 

获取类注解信息

Annotation[] annotations = entity.getClass().getAnnotations();
        for (int i = 0; i < annotations.length; i++) {
            String annoStr = annotations[i].toString();
            if (annoStr.contains("@javax.persistence.Table")) {
                annoStr = annoStr.substring(annoStr.lastIndexOf("name=") + 5);
                while (annoStr.contains(",")) {
                    annoStr = annoStr.substring(0, annoStr.lastIndexOf(","));
                }
                tableName = annoStr;
            }
        }

获取方法、属性注解

Field[] fields = entity.getClass().getDeclaredFields();

        // 遍历Bean属性
        for (int i = 0; i < fields.length; i++) {
            Field field = fields[i];
            String attrName = field.getName();
            // 获取属性对应的get方法
            Method method = getGetMethod(entity.getClass(), attrName);

            Annotation[] attrAnnotations = field.getAnnotations();
            Annotation[] methodAnnotations = method.getAnnotations();

        }
时间: 2024-11-04 07:12:06

获取调用者Class和method、反射获取get方法、获取注解信息的相关文章

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值 package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getNam

20181112_反射基础_对象获取

一.   C#中的反射 什么是反射:在C#中, 反射是有System.Reflection命名空间下的, 由.Net框架提供帮助类库,可以读取并使用dll(或exe)文件的metadata(元数据) 二.   反射的基本写法, 介绍 Load / LoadFile / LoadFrom: Assembly assembly = Assembly.Load("MyDB.MySql"); //通常推荐使用这一种 //第一步: 从 [当前目录] 加载指定名称的dll;dll名称无后缀 //l

C#中使用typeof关键字和GetType()获取类的内部结构(反射机制)

一.问题描述 java有反射机制,C#也有反射机制,在C#中typeof关键字用于获取类型的System.Type对象,该对象的GetMethods()方法可以得到类型中定义的方法对象的计集合,调用方法集合中每个方法对象的GetParameters()可以得到每个方法的参数集合,但是需要引用Reflection命名空间. 获取System.Type对象有两种方法:第一种是用typeof关键字,第二种是用对象引用调用GetType()方法 1.System.Type type =  typeof(

java进阶之反射:反射基础之如何获取一个类以及如何获取这个类的所有属性和方法(1)

java学习一段时间之后,大家可能经常会听到反射这个词,那么说明java已经学习到一个高一点的层次了.接下来我会一步步和大家一起揭开java高级特性反射的神秘面纱. 首先介绍下类对象这个概念,可能会经常用到这个概念: 类对象:java中有句很经典的话"万事万物皆对象",相信大家都不陌生,这句话告诉了我们java的特征之一,那就是面向对象.java中类的概念我们都很熟悉,既然万事万物皆是对象,那么类是谁的对象呢?<对象的概念:一个类的实例>换句话说,类是谁的实例.如此就有了类

零基础学习java------22----------社交用户分析案例,反射(概念,获取配置文件的3种方式)

1. 社交用户关系数据分析案例 数据样例: 需求: 1. 获取每个人的好友个数,并按照好友数量排序 2. 获取任意两个人的共同好友 3.获取所有人两两共同好友 1. public class SimpleFriendsDemo1 { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); try ( // 获取缓冲字符流,读取并切割数据 BufferedRead

Java之反射机制三:获取类的方法

一.实体类BigDog.java package reflex;public class BigDog extends Dog { private Integer age; public String name; public BigDog(){} private void getDog(){} private BigDog(Integer age, String name) { this.age = age; this.name = name; } public String getName(

Java之反射机制六:获取方法的泛型信息

一.测试类 public class Test02 { public void parameterTest(Map<Integer, Dog> map){ } public Map<Integer,Dog> returnTest(){ return new HashMap<Integer, Dog>(); } } 二.获取方法的参数中的泛型信息 @Test //获取方法的参数中的泛型信息 public void test() throws NoSuchMethodExc

Java 反射机制[Method反射]

Java 反射机制[Method反射] 接着上一篇Java 反射机制[Field反射],通过调用Person类的setName方法将obj的name字段的Value设置为"callPersonSetNameMethod"来了解什么是Method反射.示例代码很简单,很容易理解. 可以看到Method.invoke()实际上并不是自己实现的反射调用逻辑,而是委托给sun.reflect.MethodAccessor来处理. 真正的反射是调用MethodAccessor.invoke()真

获取不到方法的注解

注解是不干扰原来的代码的执行的,起到一种标识作用,让第三方的注解工具来提 取注解,来完成所需的任务. package two.zj; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.a