美文网首页
Java☞反射

Java☞反射

作者: 小明今晚加班 | 来源:发表于2019-05-27 11:45 被阅读0次
  1. Class是一个描述类的类
  • 里面封装了描述方法的Method;
  • 里面封装了描述字段的Field;
  • 里面封装了描述构造器 的Constructor等等属性。
  1. 如何获得一个Class对象:
  • 类名.class();
  • 类对象.getClass();
  • Class.forName(类全名)
package cn.ihep.reflect;

public class User {
    private String name;

    private Integer age;

    public User() {
        super();
    }

    public User(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    private void printMsg() {
        System.out.println("I am " + this.name + ", this year i am " + this.age + "  years old!!");
    }
}
---------------------------------------------------------- 
package cn.ihep.reflect;
import org.junit.Test;

public class TestReflect {
    @Test
    public void test1() throws Exception {
        Class clazz = User.class;
        System.out.println(clazz);

        Object u = new User();
        Class clazz2 = u.getClass();
        System.out.println(clazz2);

        Class clazz3 = Class.forName("cn.ihep.reflect.User");
        System.out.println(clazz3);
    }
}
  1. 关于Method

如何获取Method
1)、getDeclaredMethods:得到Method的数组;
2)、getDeclaredMethod(String methodName, Class ... parameterTypes);
如何调用Method
1)、如果方法是private修饰,需要先调用Method的 setAccessible(true),使其变为可访问
2)、method.invoke(obj, Object ...args)

@Test
    public void test2() throws Exception {
        Class clazz = Class.forName("cn.ihep.reflect.User");
        Method[] ms = clazz.getMethods();
        for (Method m : ms) {
            System.out.println(m);
        }

        System.out.println("---------------");
        Method[] ms2 = clazz.getDeclaredMethods();
        for (Method m : ms2) {
            System.out.println(m);
        }

        System.out.println("---------------");
        Method ms3 = clazz.getDeclaredMethod("setName", String.class);
        System.out.println(ms3);

        System.out.println("---------------");
        Object o = new User("xiaoming", 18);
        Method m4 = clazz.getDeclaredMethod("printMsg");
        m4.setAccessible(true);
        m4.invoke(o);
    }
  1. 关于Field

如果获取Field:getField(String fieldName [这种方法只能获得公有字段,想获取公有,私有等所有字段的话用getDeclaredField(s)方法]
如何获取Field的值:
1)、setAccessible(true)
2)、field.get(Object obj)
如何设置Field的值:
1)、field.set(Object obj, Object val)

@Test
    public void test3() throws Exception {
        Class clazz = Class.forName("cn.ihep.reflect.User");
        Field f1 = clazz.getDeclaredField("name");
        System.out.println(f1);
        System.out.println("----------------------------------");

        // 私有,公有的字段都能拿到
        Field[] fs = clazz.getDeclaredFields();
        for (Field f : fs) {
            System.out.println(f);
        }

        System.out.println("----------------------------------");
        //这个getFields()方法只能访问公有字段---得到的fs2是空的
        Field[] fs2 = clazz.getFields();
        

        System.out.println("----------------------------------");
        User u = new User("xiaoming", 18);
        // age字段是私有的
        Field f4 = clazz.getDeclaredField("age");
        f4.setAccessible(true);
        //无论是访问,或者是修改值,都需要设置setAccessible(true)
        Object o = f4.get(u);
        System.out.println(o);
        f4.set(u, 60);
        o = f4.get(u);
        System.out.println(o);
    }

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

Java反射机制主要提供了以下功能:

  • 在运行时构造任意一个类的对象
  • 在运行时获取任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法(属性)
  • 生成动态代理

相关文章

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

  • 一探究竟:Java反射效率低的原因到底在哪?

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • 面试官说:大家都说 Java 反射效率低,你知道原因在哪里么

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • Java面试题之JavaSE高级

    一、Java中的反射 1.说说你对Java中反射的理解 java中的反射首先是能够获取到Java...

网友评论

      本文标题:Java☞反射

      本文链接:https://www.haomeiwen.com/subject/eysctctx.html