zoukankan      html  css  js  c++  java
  • 反射的概述_反射应用实例

    Reflection(反射)是被视为动态语言的关键,
    反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,
    并能直接操作任意对象的内部属性及方法

    package com.aff.reflection;
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import org.junit.Test;
    
    /*
          Reflection(反射)是被视为动态语言的关键,
          反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,
          并能直接操作任意对象的内部属性及方法
          
    Java反射机制提供的功能:
                  ①在运行时判断任意一个对象所属的类
                  ② 在运行时构造任意一个类的对象
                  ③在运行时判断任意一个类所具有的成员变量和方法
                  ④在运行时调用任意一个对象的成员变量和方法
                  ⑤生成动态代理 
    反射相关的主要API:
                  ① java.lang.Class:代表一个类
                  ②java.lang.reflect.Method:代表类的方法
                  ③java.lang.reflect.Field:代表类的成员变量
                  ④java.lang.reflect.Constructor:代表类的构造方法
                     。。。
     */
    public class TestReflection {
    
        // 有了反射,可以通过反射创建一个类的对象,并调用其中的结构
        @Test
        public void test2() throws Exception {
            Class<Person> clazz = Person.class;
            // 1.创建clazz对应的运行时类的Person类的
            Person p = clazz.newInstance();
            System.out.println(p);// Person [name=null, age=0]
    
            // 2.通过反射调用运行时类的指定的属性
            // 2.1public 的属性
            Field f1 = clazz.getField("name");
            f1.set(p, "李白");
            System.out.println(p);// Person [name=李白, age=0]
    
            // 2.2private 的属性 使用getDeclaredField ,setAccessible(true)
            Field f2 = clazz.getDeclaredField("age");
            f2.setAccessible(true);
            f2.set(p, 33);
            System.out.println(p);// Person [name=李白, age=33]
    
            // 3.通过反射调用运行时类的指定的方法
            Method m1 = clazz.getMethod("show");
            m1.invoke(p);//后面可以跟参数,没有就去掉,  得即高歌失即休
            Method m2 = clazz.getMethod("display", String.class);//Class<?>... parameterTypes,  
    //应写class类型的
    m2.invoke(p, "罗隐");//多愁多恨亦悠悠 罗隐 } // 在有反射机制以前,如何创建一个类的对象,并调用其中的方法,属性 @Test public void test1() { Person p = new Person(); p.setAge(35); p.setName("罗隐"); System.out.println(p); p.show(); p.display("晚唐"); } }
    All that work will definitely pay off
  • 相关阅读:
    微信公众平台消息接口开发之校验签名与消息响应合并
    微信公众平台开发之在网页上添加分享到朋友圈,关注微信号等按钮
    微信公众平台自定义菜单PHP开发
    所有边权均不相同的无向图最小生成树是唯一的证明
    无向带权图的最小生成树算法——Prim及Kruskal算法思路
    排序二叉树,平衡二叉树和红黑树的概念以及相关的操作讲解
    B树、B-树、B+树、B*树
    森林、树与二叉树相互转换
    普通树转换成二叉树
    哈夫曼树
  • 原文地址:https://www.cnblogs.com/afangfang/p/12622334.html
Copyright © 2011-2022 走看看