`
lihao312
  • 浏览: 483990 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java反射简单记录

    博客分类:
  • java
阅读更多
1.   Java 反射API的第一个主要作用是获取程序在运行时刻的内部结构。这对于程序的检查工具和调试器来说,是非常实用的功能。只需要短短的十几行代码,就可以遍历出来一个Java类的内部结构,包括其中的构造方法、声明的域和定义的方法等。这不得不说是一个很强大的能力。只要有了java.lang.Class类 的对象,就可以通过其中的方法来获取到该类中的构造方法、域和方法。对应的方法分别是getConstructor、getField和getMethod。这三个方法还有相应的getDeclaredXXX版本,区别在于getDeclaredXXX版本的方法只会获取该类自身所声明的元素,而不会考虑继承下来的。Constructor、Field和Method这三个类分别表示类中的构造方法、域和方法。这些类中的方法可以获取到所对应结构的元数据。

2.待测试类
package com.home.action.test.mode.reflection;

import java.util.Map;

public class Counter {
    public int count ;
    public Map<String, Object> map;
    
    public Counter(int count) {
        this.count = count;
    }
    
    public void increase(int step) {
        count = count + step;
        System.out.println("count: "+count);
    }
}

3.测试方法
package com.home.action.test.mode.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * 测试基本类的反射
 * @author li
 */
public class Test {
    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        try {
            //构造函数
            Constructor<Counter> contructor = Counter.class.getConstructor(int.class);
            System.out.println("contructorName: "+contructor.getName());
            
            Counter counter = contructor.newInstance(10);
            counter.increase(10);
            
            //基本方法
            Method[] methods = Counter.class.getMethods();
            for(Method method: methods) {
                System.out.println("method: "+method.getName());
            }
            
            Method method = Counter.class.getMethod("increase", int.class);
            method.invoke(counter, 6);
            
            //属性值
            Field[] fields = Counter.class.getFields();
            for(Field field: fields) {
                System.out.println("fieldName: "+field.getName());
            }
            
            //count类型要设置public 否则获取不到, 提示异常信息
            Field field = Counter.class.getField("count");
            System.out.println("countField: "+field.getName());
            
            //处理泛型
            Field mapField = Counter.class.getDeclaredField("map");
            Type type = mapField.getGenericType();
            System.out.println("mapType: "+ type.toString());
            
            if(type instanceof ParameterizedType) {
                ParameterizedType paramerizedType = (ParameterizedType)type;
                
                Type[] actualTypes = paramerizedType.getActualTypeArguments();
                for(Type t: actualTypes) {
                    if(t instanceof Class){
                        Class clz = (Class)t;
                        System.out.println("classType: "+ clz.getName());
                    }
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }
}
1
4
分享到:
评论

相关推荐

    使用Java反射实现一个简单的日志记录器.txt

    本文将详细介绍如何使用Java反射机制实现一个简单但功能齐全的日志记录器——`LoggerUtil`。此日志记录器能够根据不同级别(如INFO、ERROR)记录日志,并允许通过反射动态调用日志记录方法,从而提供了一种灵活的...

    JAVA简单的反射案例

    在本篇文章中,我们将探讨Java反射的基本概念、如何使用以及其在实际开发中的应用,结合“JAVA简单的反射案例”这一主题。 1. **什么是Java反射**: Java反射机制允许我们在运行时动态地获取类的信息(如类名、...

    java反射和动态代理实例

    Java反射和动态代理是Java编程中的高级特性,它们在实际开发中有着广泛的应用。反射机制允许我们在运行时检查类、接口、字段和方法的信息,甚至能够动态调用方法和修改对象的状态。动态代理则是在运行时创建一个实现...

    Spring IOC 原理 ,Java 反射实例,自定义注解

    关于Java反射的实例,我们可以创建一个简单的例子。假设我们有一个接口`Service`和两个实现类`ServiceImpl1`、`ServiceImpl2`。在不使用反射的情况下,我们通常会通过new关键字创建服务对象。而通过反射,可以在运行...

    JAVA学习记录.rar

    本压缩包“JAVA学习记录.rar”似乎是一个个人的学习笔记集合,可能包含了一系列关于Java编程的基础到高级概念。 在学习Java的过程中,首先会接触的是基础语法,例如变量、数据类型、运算符、控制结构(如if语句、...

    基于Java反射的APP自动化混合测试框架的研究与实现.zip

    本文将深入探讨一个基于Java反射技术构建的APP自动化混合测试框架的研究与实现。Java反射机制是Java语言的一个强大特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能够动态调用方法和改变对象状态。在...

    Java反射学习和反射的应用场景干货都在这里

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作,如创建对象、调用方法、访问属性等。在本文中,我们将深入理解Java反射的概念,掌握其核心实现,并探讨它在实际开发中的...

    java反射机制学习(五):工厂模式

    Java反射机制是Java语言提供的一种强大的能力,它允许在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。在本篇“java反射机制学习(五):工厂模式”中,我们将探讨如何利用反射与工厂模式...

    将Map转换成Java实体

    总结起来,将Map转换为Java实体对象是Java开发中常见的需求,我们可以利用Core Java JDK 1.8的泛型和反射来实现这一功能。通过创建一个通用的工具类,我们可以简化代码并提高代码复用性。在使用过程中,需要注意处理...

    Java语言的反射.pdf

    ### Java语言的反射机制 #### 10.1 Java Reflection API简介 Java的反射机制是一种强大的功能,允许程序在运行时动态地获取类的信息、构造类的对象、调用类的方法等。这一机制使得Java程序具备了高度的灵活性与...

    利用java反射创建通用的数据库查询方法.pdf

    Java反射机制是Java语言提供的一种强大的能力,允许程序在运行时动态地获取类的信息并调用其方法。在本示例中,`BaseDao` 类使用反射来创建一个通用的数据库查询方法,这可以极大地提高代码的复用性和灵活性。以下是...

    利用Java的反射与代理实现AOP.docx

    总结来说,通过Java的反射和动态代理,我们可以轻松地实现AOP,将日志记录等横切关注点与业务逻辑解耦。这种设计模式在大型复杂应用中尤为有用,因为它允许我们以灵活的方式管理横切关注点,而无需修改大量业务代码...

    Java开发技术大全(500个源代码).

    listConstructors.java 利用反射机制获取构造器列表 listFields.java 利用反射机制获取成员属性列表 listMethods.java 利用反射机制获取成员方法列表 loadClass.java 动态装载一个类 Shape.java 一个用于测试的...

    大一的java学习记录

    进一步深入,你将接触到Java的高级特性,如反射、动态代理、注解等。这些特性在框架开发和元编程中十分有用。同时,Java 8及以后的版本引入了lambda表达式和流API,使得函数式编程成为可能,极大地简化了代码。 在...

    Java通过反射访问注解信息的方法示例

    总结一下,Java反射机制提供了访问注解信息的功能,这在许多场景下非常有用。通过`getAnnotations()`和`getAnnotation(Class&lt;T&gt; annotationType)`方法,我们可以方便地获取到类成员方法上的注解,并读取其包含的数据...

    一些简单java例子

    这个名为“一些简单java例子”的压缩包文件显然包含了针对初学者的基础Java编程实例,旨在帮助新手理解并掌握Java语言的核心概念。 1. **Java基础知识**: - **变量与数据类型**:Java有基本数据类型(如整型、...

    利用反射和动态代理机制实现自定义拦截器Interceptor

    反射机制是指在Java程序中,可以在运行时动态地获取和修改类的结构和行为,而不是在编译时确定的。动态代理是指在运行时动态地生成代理对象,以实现对目标对象的拦截和控制。 二、代码实现 1、定义目标接口 首先...

Global site tag (gtag.js) - Google Analytics