当前位置: 首页 > news >正文

Java反射机制简单了解_Reflection

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

反射机制:

反射(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。”这个概念常常会和内省(Introspection)混淆,以下是这两个术语在Wikipedia中的解释:

内省用于在运行时检测某个对象的类型和其包含的属性;

反射用于在运行时检测和修改某个对象的结构及其行为。

从它们的定义可以看出,内省是反射的一个子集。有些语言支持内省,但并不支持反射,如C++。


下面看反射的例子:

Person.java

package reflect;

/**
 * Created with IntelliJ IDEA.
 * User: ASUS
 * Date: 14-7-10
 * Time: 下午2:10
 * To change this template use File | Settings | File Templates.
 */
public class Person {

    public static final int MAX_LENGTH = 10;
    public static final String BELONG = "MY";

    public int age;
    public String name;
    public String address;

    public Person() {
    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }


    public Person(int age, String name, String address) {
        this.age = age;
        this.name = name;
        this.address = address;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }


    public void doWork(String command) {
        System.out.println("command==" + command);
    }

    public void doWork(String command, Boolean flag) {
        if (flag) {
            System.out.println("command==" + command);
        } else {
            System.out.println("command==" + command);
        }
    }


    public String sayHello() {
        return "I'm hello";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;

        Person that = (Person) o;

        if (age != that.age) return false;
        if (!name.equals(that.name)) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result = age;
        result = 31 * result + name.hashCode();
        return result;
    }
}


ReflectionTest.java

package reflect;

import org.junit.Test;

import java.lang.annotation.Annotation;
import java.lang.reflect.*;

/**
 * Created with IntelliJ IDEA.
 * User: ASUS
 * Date: 14-7-10
 * Time: 下午2:10
 * To change this template use File | Settings | File Templates.
 */
public class ReflectionTest {


    /**
     * 通过反正调用某个对象的方法
     *
     * @throws Exception
     */
    @Test
    public void test8() throws Exception {
        Person person = new Person();
        System.out.println(person.getClass().getName());


        Class<Person> personClass = (Class<Person>) Class.forName("reflect.Person");
        Person person1 = personClass.newInstance();
        System.out.println(person1.sayHello());


        /**
         * parameterTypes表示要调用函数的参数的class类型
         * 是一个可变参数列表
         * public Method getMethod(String name, Class<?>... parameterTypes)
         */

        try {
            Method doWorkMethod = personClass.getMethod("doWork", String.class);
            String command = "never give up";
            /**
             * invoke函数的第一个参数是一个类的实例,表示要调用该对象的方法,第二个及以后的参数是
             * 可变参数列表,表示要调用方法的参数
             */
            doWorkMethod.invoke(person1, command);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }


    /**
     * 获取构造函数,并创建对象。
     */
    @Test
    public void test98() throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
        Class<Person> personClass = (Class<Person>) Class.forName("reflect.Person");

        Constructor<Person>[] constructors = (Constructor<Person>[]) personClass.getConstructors();

        int n = 0;
        for (Constructor constructor : constructors) {
            //构造函数的名字
            System.out.println(n + "=" + constructor.getName());
            //构造函数的参数的个数
            System.out.println(n + "=ParameterCount=" + constructor.getParameterCount());
            n++;
        }

        Person person = constructors[0].newInstance(12, "hello", "world");
        System.out.println(person.getName() + "     " + person.getAddress());

        Person person1 = constructors[1].newInstance(15, "sdsd");
        System.out.println(person1.getAge());
    }


    /**
     * 得到某个类的所有属性
     */
    @Test
    public void test987() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<Person> personClass = (Class<Person>) Class.forName("reflect.Person");

        Field[] fields = personClass.getFields();
        for (Field field : fields) {
            System.out.println(field.getName()); //字段的名称
            System.out.println(field.getType().getName()); //字段的数据类型
            int modifiers = field.getModifiers();
            boolean isStatic = Modifier.isStatic(modifiers);
            if (isStatic) {
                /**
                 * 如果是静态字段,get方法的参数可以为null
                 */
                System.out.println(field.getName() + "是静态字段,value=" + field.get(null));
            } else {
                /**
                 * 如果是实例字段,obj对象是一个该实例字段所属的对象或一个实例
                 */
                System.out.println(field.getName() + "不是静态字段,value=" + field.get(personClass.newInstance()));
            }
        }
    }


    /**
     * 得到一个类的所有方法
     */
    @Test
    public void test098() throws ClassNotFoundException {
        Class<Person> personClass = (Class<Person>) Class.forName("reflect.Person");
        Method[] methods = personClass.getMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
            int m = method.getModifiers();
            if (Modifier.isPublic(m)) {
                System.out.println(method.getName() + "是一个public方法");
            }

            Annotation[] annotations = method.getDeclaredAnnotations();
            System.out.println("===S===");
            for (Annotation annotation : annotations) {
                System.out.println(annotation.toString());
            }
            System.out.println("===E===");
        }
    }
}

====END====

转载于:https://my.oschina.net/xinxingegeya/blog/289429

相关文章:

  • 前端 图表
  • Linux系统备份与还原
  • 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)
  • java 获取HttpRequest Header 的几种方法 请求request的所有参数实现方法
  • SolrCould 集群搭建
  • 学习设计模式--观察者模式(C++)
  • 第八课:SQL数据库插入数据和更新数据
  • CF446C DZY Loves Fibonacci Numbers 万能的线段树
  • 如何通过Dataworks禁止MaxCompute 子账号跨Project访问
  • c++Template 的辨析
  • Linux 搭建SVN 服务器
  • Golang并发(四)- buffered channel 和 Worker Pools
  • jbpm流程发布以及流程实例管理
  • Django高级部分
  • MySQL的EXPLAIN的EXTRA
  • __proto__ 和 prototype的关系
  • 「译」Node.js Streams 基础
  • 5、React组件事件详解
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • Just for fun——迅速写完快速排序
  • MD5加密原理解析及OC版原理实现
  • ng6--错误信息小结(持续更新)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • node入门
  • SQLServer之索引简介
  • 番外篇1:在Windows环境下安装JDK
  • 给Prometheus造假数据的方法
  • 马上搞懂 GeoJSON
  • 前端设计模式
  • 深度学习中的信息论知识详解
  • 详解NodeJs流之一
  • 学习笔记:对象,原型和继承(1)
  • 字符串匹配基础上
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (八)Flask之app.route装饰器函数的参数
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)大型网站架构演变和知识体系
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net 调用php,php 调用.net com组件 --
  • .NET/C# 使用反射注册事件
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [20171101]rman to destination.txt
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured